00001
00056 #ifndef INC_MI32_UNSIGNEDSET_H
00057 #define INC_MI32_UNSIGNEDSET_H
00058
00059 #ifndef INC_MI32_SIMPLEAR_H
00060 #include <mi32/simplear.h>
00061 #endif
00062
00063 #ifndef INC_MI32_BITSET_H
00064 #include <mi32/bitset.h>
00065 #endif
00066
00067 #ifdef MISYSTEMDLL
00068 #define CLASSLIBEXPORT MI_DLLCLASSEXPORT
00069 #else
00070 #define CLASSLIBEXPORT MI_DLLCLASSIMPORT
00071 #endif
00072
00073
00074
00076 class CLASSLIBEXPORT UNSIGNEDSET {
00077 public:
00078
00080 class CLASSLIBEXPORT ITERATOR32 {
00081 public:
00082
00085 explicit ITERATOR32 (
00086 const UNSIGNEDSET& Set
00087 ) :
00088 m_Set(Set)
00089 { Reset(); }
00090
00092 UINT32 operator* (
00093 ) const { return (m_Num); }
00094
00096 operator UINT32 (
00097 ) const { return (m_Num); }
00098
00100 ITERATOR32& operator++ ();
00101
00103 bool IsEnd () const
00104 { return (m_Num == UINT32_MAX); }
00105
00107 void Reset ();
00108
00110 void SetEnd ()
00111 { m_Num = UINT32_MAX; }
00112
00114 UINT32 SkipCount ();
00115
00116 private:
00117 #ifndef GENERATING_DOXYGEN_OUTPUT
00118 const UNSIGNEDSET& m_Set;
00119 const UINT8 *m_pData;
00120 const UINT8 *m_pEnd;
00121 UINT32 m_Num;
00122 UINT32 m_CountLeft;
00123 #endif // GENERATING_DOXYGEN_OUTPUT
00124 };
00125
00127 class CLASSLIBEXPORT ITERATOR64 {
00128 public:
00129
00131 explicit ITERATOR64 (
00132 const UNSIGNEDSET& Set
00133 ) :
00134 m_Set(Set)
00135 { Reset(); }
00136
00138 UINT64 operator* (
00139 ) const { return (m_Num); }
00140
00142 operator UINT64 (
00143 ) const { return (m_Num); }
00144
00146 ITERATOR64& operator++ ();
00147
00149 bool IsEnd () const
00150 { return (m_Num == UINT64_MAX); }
00151
00153 void Reset ();
00154
00156 void SetEnd ()
00157 { m_Num = UINT64_MAX; }
00158
00160 UINT32 SkipCount ();
00161
00162 private:
00163 #ifndef GENERATING_DOXYGEN_OUTPUT
00164 const UNSIGNEDSET& m_Set;
00165 const UINT8 *m_pData;
00166 const UINT8 *m_pEnd;
00167 UINT64 m_Num;
00168 UINT32 m_CountLeft;
00169 #endif // GENERATING_DOXYGEN_OUTPUT
00170 };
00171
00173 class CLASSLIBEXPORT ITERATOR_RANGE32 {
00174 public:
00175
00178 explicit ITERATOR_RANGE32 (
00179 const UNSIGNEDSET& Set
00180 ) :
00181 m_itNext(Set)
00182 { Reset(); }
00183
00185 ITERATOR_RANGE32& operator++ ();
00186
00188 UINT32 GetFirst () const
00189 { return (m_NumFirst); }
00190
00192 UINT32 GetLast () const
00193 { return (m_NumLast); }
00194
00196 bool IsEnd () const
00197 { return (m_NumFirst == UINT32_MAX); }
00198
00200 void Reset ();
00201
00203 void SetEnd ()
00204 { m_NumFirst = m_NumLast = UINT32_MAX; }
00205
00206 private:
00207 #ifndef GENERATING_DOXYGEN_OUTPUT
00208 ITERATOR32 m_itNext;
00209 UINT32 m_NumFirst;
00210 UINT32 m_NumLast;
00211 #endif // GENERATING_DOXYGEN_OUTPUT
00212 };
00213
00215 class CLASSLIBEXPORT ITERATOR_RANGE64 {
00216 public:
00217
00219 explicit ITERATOR_RANGE64 (
00220 const UNSIGNEDSET& Set
00221 ) :
00222 m_itNext(Set)
00223 { Reset(); }
00224
00226 ITERATOR_RANGE64& operator++ ();
00227
00229 UINT64 GetFirst () const
00230 { return (m_NumFirst); }
00231
00233 UINT64 GetLast () const
00234 { return (m_NumLast); }
00235
00237 bool IsEnd () const
00238 { return (m_NumFirst == UINT64_MAX); }
00239
00241 void Reset ();
00242
00244 void SetEnd ()
00245 { m_NumFirst = m_NumLast = UINT64_MAX; }
00246
00247 private:
00248 #ifndef GENERATING_DOXYGEN_OUTPUT
00249 ITERATOR64 m_itNext;
00250 UINT64 m_NumFirst;
00251 UINT64 m_NumLast;
00252 #endif // GENERATING_DOXYGEN_OUTPUT
00253 };
00254
00256 class CLASSLIBEXPORT ITERATOR_INTERSECTION32 {
00257 public:
00258
00261 explicit ITERATOR_INTERSECTION32 (
00262 const UNSIGNEDSET& set1,
00263 const UNSIGNEDSET& set2
00264 ) :
00265 m_it1(set1),
00266 m_it2(set2)
00267 { Reset(); }
00268
00270 UINT32 operator* (
00271 ) const { return (m_Num); }
00272
00274 operator UINT32 (
00275 ) const { return (m_Num); }
00276
00278 ITERATOR_INTERSECTION32& operator++ ();
00279
00281 bool IsEnd () const
00282 { return (m_Num == UINT32_MAX); }
00283
00285 void Reset ();
00286
00288 void SetEnd ()
00289 { m_Num = UINT32_MAX; }
00290
00291 private:
00292 #ifndef GENERATING_DOXYGEN_OUTPUT
00293 ITERATOR_RANGE32 m_it1;
00294 ITERATOR_RANGE32 m_it2;
00295 UINT32 m_Num;
00296 #endif
00297 };
00298
00300 class CLASSLIBEXPORT ITERATOR_INTERSECTION64 {
00301 public:
00302
00305 explicit ITERATOR_INTERSECTION64 (
00306 const UNSIGNEDSET& set1,
00307 const UNSIGNEDSET& set2
00308 ) :
00309 m_it1(set1),
00310 m_it2(set2)
00311 { Reset(); }
00312
00314 UINT64 operator* (
00315 ) const { return (m_Num); }
00316
00318 operator UINT64 (
00319 ) const { return (m_Num); }
00320
00322 ITERATOR_INTERSECTION64& operator++ ();
00323
00325 bool IsEnd () const
00326 { return (m_Num == UINT64_MAX); }
00327
00329 void Reset ();
00330
00332 void SetEnd ()
00333 { m_Num = UINT64_MAX; }
00334
00335 private:
00336 #ifndef GENERATING_DOXYGEN_OUTPUT
00337 ITERATOR_RANGE64 m_it1;
00338 ITERATOR_RANGE64 m_it2;
00339 UINT64 m_Num;
00340 #endif
00341 };
00342
00344 UNSIGNEDSET ();
00345
00347 ~UNSIGNEDSET ();
00348
00351 ERRVALUE AddRange (
00352 UINT32 min,
00353 UINT32 max
00354 );
00355
00358 ERRVALUE AddRange (
00359 INT32 min,
00360 INT32 max
00361 ) { return (AddRange(static_cast<UINT32>(min),static_cast<UINT32>(max))); }
00362
00365 ERRVALUE AddRange (
00366 UINT64 min,
00367 UINT64 max
00368 );
00369
00372 ERRVALUE AddRange (
00373 INT64 min,
00374 INT64 max
00375 ) { return (AddRange(static_cast<UINT64>(min),static_cast<UINT64>(max))); }
00376
00379 ERRVALUE AddSingle (
00380 UINT16 num
00381 ) { return (AddSingle(static_cast<UINT32>(num))); }
00382
00385 ERRVALUE AddSingle (
00386 UINT32 num
00387 ) { return (AddRange(num,num)); }
00388
00391 ERRVALUE AddSingle (
00392 INT32 num
00393 ) { return (AddRange(num,num)); }
00394
00397 ERRVALUE AddSingle (
00398 UINT64 num
00399 ) { return (AddRange(num,num)); }
00400
00403 ERRVALUE AddSingle (
00404 INT64 num
00405 ) { return (AddRange(num,num)); }
00406
00408 ERRVALUE Assign (
00409 const UNSIGNEDSET& set
00410 );
00411
00413 ERRVALUE Assign (
00414 const BITSET_UNOWNED& bitset
00415 );
00416
00419 ERRVALUE AttachCompressed (
00420 UINT8 *& pData,
00421 UINT32 BufSize
00422 );
00423
00426 ERRVALUE AttachCompressed (
00427 SIMPLE_ARRAY<UINT8>& Data
00428 );
00429
00432 void Clear ();
00433
00435 ERRVALUE Compress ();
00436
00440 bool Contains (
00441 UINT16 ItemNum
00442 ) const { return (Contains(static_cast<UINT32>(ItemNum))); }
00443
00447 bool Contains (
00448 UINT32 ItemNum
00449 ) const;
00450
00454 bool Contains (
00455 INT32 ItemNum
00456 ) const { return (Contains(static_cast<UINT32>(ItemNum))); }
00457
00461 bool Contains (
00462 UINT64 ItemNum
00463 ) const;
00464
00468 bool Contains (
00469 INT64 ItemNum
00470 ) const { return (Contains(static_cast<UINT64>(ItemNum))); }
00471
00473 UINT64 CountItems () const;
00474
00476 ERRVALUE Decompress ();
00477
00479 ERRVALUE DecompressForContains ();
00480
00483 void UNSIGNEDSET::Exchange (
00484 UNSIGNEDSET& other
00485 );
00486
00488 ERRVALUE GetBitSet (
00489 BITSET& bitset,
00490 UINT32 NumEntries
00491 ) const;
00492
00495 const SIMPLE_ARRAY<UINT8>& GetCompressed ();
00496
00498 UINT64 GetFirstItem () const
00499 { return (m_FirstItem); }
00500
00502 UINT64 GetLastItem () const
00503 { return (m_LastItem); }
00504
00508 ERRVALUE Intersect (
00509 const UNSIGNEDSET& rhs
00510 );
00511
00513 bool IsCompressed () const
00514 { return (!m_SpanAllInSet.HasEntries()); }
00515
00517 bool IsEmpty () const
00518 { return (m_Data.IsEmpty() && !m_SpanAllInSet.HasEntries()); }
00519
00522 ERRVALUE LoadCompressed (
00523 const UINT8 *pData,
00524 UINT32 BufSize
00525 );
00526
00529 ERRVALUE LoadCompressed (
00530 const SIMPLE_ARRAY<UINT8>& Data
00531 ) { return (LoadCompressed(static_cast<const UINT8*>(Data),Data.GetNumItems())); }
00532
00535 ERRVALUE RemoveRange (
00536 UINT32 min,
00537 UINT32 max
00538 );
00539
00542 ERRVALUE RemoveRange (
00543 INT32 min,
00544 INT32 max
00545 ) { return (RemoveRange(static_cast<UINT32>(min),static_cast<UINT32>(max))); }
00546
00549 ERRVALUE RemoveRange (
00550 UINT64 min,
00551 UINT64 max
00552 );
00553
00556 ERRVALUE RemoveRange (
00557 INT64 min,
00558 INT64 max
00559 ) { return (RemoveRange(static_cast<UINT64>(min),static_cast<UINT64>(max))); }
00560
00563 ERRVALUE RemoveSet (
00564 const UNSIGNEDSET& set
00565 );
00566
00569 ERRVALUE RemoveSingle (
00570 UINT32 num
00571 ) { return (RemoveRange(num,num)); }
00572
00575 ERRVALUE RemoveSingle (
00576 INT32 num
00577 ) { return (RemoveRange(num,num)); }
00578
00581 ERRVALUE RemoveSingle (
00582 UINT64 num
00583 ) { return (RemoveRange(num,num)); }
00584
00587 ERRVALUE RemoveSingle (
00588 INT64 num
00589 ) { return (RemoveRange(num,num)); }
00590
00593 ERRVALUE SetContains (
00594 UINT32 num,
00595 bool inset
00596 );
00597
00600 ERRVALUE SetContains (
00601 UINT64 num,
00602 bool inset
00603 );
00604
00607 ERRVALUE ToggleRange (
00608 UINT32 min,
00609 UINT32 max
00610 );
00611
00614 ERRVALUE ToggleRange (
00615 UINT64 min,
00616 UINT64 max
00617 );
00618
00622 int ToggleSingle (
00623 UINT64 num
00624 );
00625
00629 ERRVALUE Union (
00630 const UNSIGNEDSET& rhs
00631 );
00632
00636 ERRVALUE UnionExclusive (
00637 const UNSIGNEDSET& rhs
00638 );
00639
00640 private:
00641 #ifndef GENERATING_DOXYGEN_OUTPUT
00642 SIMPLE_ARRAY<UINT8> m_Data;
00643 UINT64 m_FirstItem;
00644 UINT64 m_LastItem;
00645 UINT64 m_LastCount;
00646 UINT32 m_LastCountIndex;
00647 UINT32 m_EndIndex;
00648 BITSET m_SpanAllInSet;
00649 SIMPLE_ARRAY<UINT32*> m_SpanData;
00650 SIMPLE_ARRAY<UINT32*> m_SpanPool;
00651
00652 ERRVALUE AppendCount (UINT32 value);
00653 ERRVALUE AppendCount (UINT64 value);
00654 ERRVALUE AppendSkip (UINT32 value);
00655 ERRVALUE AppendSkip (UINT64 value);
00656 void FindNewFirstItemUncompressed ();
00657 void FindNewLastItemUncompressed ();
00658 void FreeSpans ();
00659 ERRVALUE GetSpan (UINT32 Span, bool initialize = true);
00660 ERRVALUE LoadFinish ();
00661 void ReleaseSpanToPool (UINT32 Span);
00662 ERRVALUE RangeAddCompressed (UINT32 First, UINT32 Last);
00663 ERRVALUE RangeAddCompressed (UINT64 First, UINT64 Last);
00664 ERRVALUE RangeAddUncompressed (UINT32 First, UINT32 Last);
00665 ERRVALUE RangeAddUncompressed (UINT64 First, UINT64 Last);
00666 ERRVALUE RangeRemoveUncompressed (UINT32 First, UINT32 Last);
00667 ERRVALUE RangeRemoveUncompressed (UINT64 First, UINT64 Last);
00668 ERRVALUE RangeToggleUncompressed (UINT32 First, UINT32 Last);
00669 ERRVALUE RangeToggleUncompressed (UINT64 First, UINT64 Last);
00670 ERRVALUE SpanClearRange (UINT32 Span, UINT32 MinPos, UINT32 MaxPos);
00671 ERRVALUE SpanSetRange (UINT32 Span, UINT32 MinPos, UINT32 MaxPos);
00672 ERRVALUE SpanToggleRange (UINT32 Span, UINT32 MinPos, UINT32 MaxPos);
00673
00674
00675 UNSIGNEDSET (const UNSIGNEDSET&);
00676 UNSIGNEDSET& operator= (const UNSIGNEDSET&);
00677 #endif // GENERATING_DOXYGEN_OUTPUT
00678
00679 };
00680
00681
00682
00683 #undef CLASSLIBEXPORT
00684
00685 #endif // INC_MI32_UNSIGNEDSET_H