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 }