File indexing completed on 2024-04-14 14:10:45

0001 #include <HtmRange.h>
0002 
0003 #include <stdio.h>
0004 #include <string.h>
0005 
0006 #define INSIDE         1
0007 #define OUTSIDE        -1
0008 #define INTERSECT      0
0009 #define GAP_HISTO_SIZE 10000
0010 
0011 extern "C" {
0012 int cc_ID2name(char *name, uint64 id);
0013 }
0014 
0015 HtmRange::HtmRange()
0016 {
0017     my_los = new SkipList;
0018     my_his = new SkipList;
0019 }
0020 
0021 HtmRange::~HtmRange()
0022 {
0023     my_los->freeRange(-1, KEY_MAX);
0024     my_his->freeRange(-1, KEY_MAX);
0025     delete my_los;
0026     delete my_his;
0027 }
0028 
0029 InclusionType HtmRange::tinside(const Key mid) const
0030 {
0031     // clearly out, inside, share a boundary, off by one to some boundary
0032     InclusionType t1, t2;
0033 
0034     Key GH = my_his->findMAX(mid);
0035     Key GL = my_los->findMAX(mid);
0036 
0037     if (GH < GL)
0038         t1 = InclInside;
0039     else
0040         t1 = InclOutside;
0041 
0042     Key SH = my_his->findMIN(mid);
0043     Key SL = my_los->findMIN(mid);
0044     if (SH < SL)
0045         t2 = InclInside;
0046     else
0047         t2 = InclOutside;
0048 
0049     if (t1 == t2)
0050         return t1;
0051     if (t1 == InclInside)
0052         return InclHi;
0053     else
0054         return InclLo;
0055 }
0056 
0057 void HtmRange::mergeRange(const Key lo, const Key hi)
0058 {
0059     int lo_flag = tinside(lo);
0060     int hi_flag = tinside(hi);
0061 
0062     // delete all nodes (key) in his and los where lo < key < hi
0063     my_his->freeRange(lo, hi);
0064     my_los->freeRange(lo, hi);
0065 
0066     // add if not inside a pre-existing interval
0067     if (lo_flag == InclHi)
0068     {
0069     }
0070     else if (lo_flag == InclLo || (lo_flag == InclOutside))
0071     {
0072         my_los->insert(lo, 33);
0073     }
0074 
0075     if (hi_flag == InclLo)
0076     {
0077     }
0078     else if (hi_flag == InclOutside || hi_flag == InclHi)
0079     {
0080         my_his->insert(hi, 33);
0081     }
0082 }
0083 
0084 void HtmRange::reset()
0085 {
0086     my_los->reset();
0087     my_his->reset();
0088 }
0089 
0090 int HtmRange::getNext(Key *lo, Key *hi)
0091 {
0092     *lo = my_los->getkey();
0093     if (*lo <= (Key)0)
0094     {
0095         *hi = *lo = (Key)0;
0096         return 0;
0097     }
0098     *hi = my_his->getkey();
0099     my_his->step();
0100     my_los->step();
0101     return 1;
0102 }