File indexing completed on 2025-07-02 08:42:14
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef TColStd_PackedMapOfInteger_HeaderFile
0017 #define TColStd_PackedMapOfInteger_HeaderFile
0018
0019 #include <Standard.hxx>
0020 #include <Standard_Boolean.hxx>
0021 #include <Standard_DefineAlloc.hxx>
0022 #include <Standard_Integer.hxx>
0023 #include <Standard_NoSuchObject.hxx>
0024 #include <Standard_OStream.hxx>
0025 #include <Standard_Handle.hxx>
0026
0027
0028
0029
0030 class TColStd_PackedMapOfInteger
0031 {
0032 public:
0033 DEFINE_STANDARD_ALLOC
0034
0035 private:
0036
0037
0038 static const unsigned int MASK_LOW = 0x001f;
0039
0040
0041 static const unsigned int MASK_HIGH = ~MASK_LOW;
0042
0043
0044
0045
0046
0047
0048
0049 class TColStd_intMapNode
0050 {
0051 public:
0052 TColStd_intMapNode (TColStd_intMapNode* thePtr = NULL)
0053 : myNext (thePtr), myMask (0), myData (0) {}
0054
0055 TColStd_intMapNode (Standard_Integer theValue, TColStd_intMapNode*& thePtr)
0056 : myNext (thePtr),
0057 myMask ((unsigned int) (theValue & MASK_HIGH)),
0058 myData (1 << (theValue & MASK_LOW)) {}
0059
0060 TColStd_intMapNode (unsigned int theMask, unsigned int theData, TColStd_intMapNode* thePtr)
0061 : myNext (thePtr),
0062 myMask (theMask),
0063 myData (theData) {}
0064
0065 unsigned int Mask() const { return myMask; }
0066
0067 unsigned int Data() const { return myData; }
0068
0069 unsigned int& ChangeMask() { return myMask; }
0070
0071 unsigned int& ChangeData() { return myData; }
0072
0073
0074 Standard_Integer Key() const { return Standard_Integer (myMask & MASK_HIGH); }
0075
0076
0077 size_t NbValues() const { return size_t(myMask & MASK_LOW) + 1; }
0078
0079
0080 Standard_Boolean HasValues() const { return (myData != 0); }
0081
0082
0083 Standard_Integer HasValue (Standard_Integer theValue) const { return (myData & (1 << (theValue & MASK_LOW))); }
0084
0085
0086
0087 Standard_Boolean AddValue (Standard_Integer theValue)
0088 {
0089 const Standard_Integer aValInt = (1 << (theValue & MASK_LOW));
0090 if ((myData & aValInt) == 0)
0091 {
0092 myData ^= aValInt;
0093 ++myMask;
0094 return Standard_True;
0095 }
0096 return Standard_False;
0097 }
0098
0099
0100
0101 Standard_Boolean DelValue (Standard_Integer theValue)
0102 {
0103 const Standard_Integer aValInt = (1 << (theValue & MASK_LOW));
0104 if ((myData & aValInt) != 0)
0105 {
0106 myData ^= aValInt;
0107 myMask--;
0108 return Standard_True;
0109 }
0110 return Standard_False;
0111 }
0112
0113
0114
0115 Standard_Integer FindNext (unsigned int& theMask) const;
0116
0117
0118 TColStd_intMapNode* Next() const { return myNext; }
0119
0120
0121 void SetNext (TColStd_intMapNode* theNext) { myNext = theNext; }
0122
0123 public:
0124
0125 Standard_Integer HashCode (Standard_Integer theUpper) const
0126 {
0127 return (myMask >> 5) % theUpper + 1;
0128 }
0129
0130
0131 Standard_Boolean IsEqual (Standard_Integer theOther) const
0132 {
0133 return ((myMask >> 5) == (unsigned)theOther);
0134 }
0135
0136 private:
0137 TColStd_intMapNode* myNext;
0138 unsigned int myMask;
0139 unsigned int myData;
0140 };
0141
0142 public:
0143
0144
0145 class Iterator
0146 {
0147 public:
0148
0149
0150 Iterator()
0151 : myBuckets (NULL),
0152 myNode (NULL),
0153 myNbBuckets (-1),
0154 myBucket (-1),
0155 myIntMask (~0U),
0156 myKey (0) {}
0157
0158
0159 Iterator (const TColStd_PackedMapOfInteger& theMap)
0160 : myBuckets (theMap.myData1),
0161 myNode (NULL),
0162 myNbBuckets (theMap.myData1 != NULL ? theMap.myNbBuckets : -1),
0163 myBucket (-1),
0164 myIntMask (~0U)
0165 {
0166 next();
0167 myKey = myNode != NULL ? TColStd_intMapNode_findNext (myNode, myIntMask) : 0;
0168 }
0169
0170
0171 void Initialize (const TColStd_PackedMapOfInteger& theMap)
0172 {
0173 myBuckets = theMap.myData1;
0174 myBucket = -1;
0175 myNode = NULL;
0176 myNbBuckets = theMap.myData1 != NULL ? theMap.myNbBuckets : -1;
0177 next();
0178
0179 myIntMask = ~0U;
0180 myKey = myNode != NULL ? TColStd_intMapNode_findNext (myNode, myIntMask) : 0;
0181 }
0182
0183
0184 void Reset()
0185 {
0186 myBucket = -1;
0187 myNode = NULL;
0188 next();
0189
0190 myIntMask = ~0U;
0191 myKey = myNode != NULL ? TColStd_intMapNode_findNext (myNode, myIntMask) : 0;
0192 }
0193
0194
0195 Standard_Integer Key() const
0196 {
0197 Standard_NoSuchObject_Raise_if ((myIntMask == ~0U), "TColStd_MapIteratorOfPackedMapOfInteger::Key");
0198 return myKey;
0199 }
0200
0201
0202 Standard_Boolean More() const { return myNode != NULL; }
0203
0204
0205 void Next()
0206 {
0207 for (; myNode != NULL; next())
0208 {
0209 myKey = TColStd_intMapNode_findNext (myNode, myIntMask);
0210 if (myIntMask != ~0u)
0211 {
0212 break;
0213 }
0214 }
0215 }
0216 private:
0217
0218 void next()
0219 {
0220 if (myBuckets == NULL)
0221 {
0222 return;
0223 }
0224
0225 if (myNode != NULL)
0226 {
0227 myNode = myNode->Next();
0228 }
0229
0230 while (myNode == NULL)
0231 {
0232 ++myBucket;
0233 if (myBucket > myNbBuckets)
0234 {
0235 return;
0236 }
0237 myNode = myBuckets[myBucket];
0238 }
0239 }
0240
0241 private:
0242 TColStd_intMapNode** myBuckets;
0243 TColStd_intMapNode* myNode;
0244 Standard_Integer myNbBuckets;
0245 Standard_Integer myBucket;
0246
0247 unsigned int myIntMask;
0248 Standard_Integer myKey;
0249 };
0250
0251 public:
0252
0253
0254 TColStd_PackedMapOfInteger (const Standard_Integer theNbBuckets = 1)
0255 : myData1 (NULL),
0256 myNbBuckets (theNbBuckets),
0257 myNbPackedMapNodes (0),
0258 myExtent (0) {}
0259
0260
0261 TColStd_PackedMapOfInteger (const TColStd_PackedMapOfInteger& theOther)
0262 : myData1 (NULL),
0263 myNbBuckets (1),
0264 myNbPackedMapNodes (0),
0265 myExtent (0)
0266 {
0267 Assign (theOther);
0268 }
0269
0270 inline TColStd_PackedMapOfInteger&
0271 operator = (const TColStd_PackedMapOfInteger& Other)
0272 { return Assign(Other); }
0273
0274 Standard_EXPORT TColStd_PackedMapOfInteger&
0275 Assign (const TColStd_PackedMapOfInteger&);
0276 Standard_EXPORT void ReSize (const Standard_Integer NbBuckets);
0277 Standard_EXPORT void Clear ();
0278 ~TColStd_PackedMapOfInteger() { Clear(); }
0279 Standard_EXPORT Standard_Boolean
0280 Add (const Standard_Integer aKey);
0281 Standard_EXPORT Standard_Boolean
0282 Contains (const Standard_Integer aKey) const;
0283 Standard_EXPORT Standard_Boolean
0284 Remove (const Standard_Integer aKey);
0285
0286
0287 Standard_Integer NbBuckets() const { return myNbBuckets; }
0288
0289
0290 Standard_Integer Extent() const { return Standard_Integer (myExtent); }
0291
0292
0293 Standard_Boolean IsEmpty() const { return myNbPackedMapNodes == 0; }
0294
0295
0296
0297
0298 Standard_EXPORT Standard_Integer GetMinimalMapped () const;
0299
0300
0301
0302
0303 Standard_EXPORT Standard_Integer GetMaximalMapped () const;
0304
0305
0306
0307 Standard_EXPORT void Statistics (Standard_OStream& theStream) const;
0308
0309 public:
0310
0311
0312
0313
0314
0315
0316
0317
0318 Standard_EXPORT void Union (const TColStd_PackedMapOfInteger&,
0319 const TColStd_PackedMapOfInteger&);
0320
0321
0322
0323
0324
0325
0326
0327 Standard_EXPORT Standard_Boolean Unite (const TColStd_PackedMapOfInteger&);
0328
0329
0330
0331
0332 TColStd_PackedMapOfInteger& operator |= (const TColStd_PackedMapOfInteger& MM)
0333 { Unite(MM); return *this; }
0334
0335
0336
0337
0338
0339
0340
0341 Standard_EXPORT void Intersection (const TColStd_PackedMapOfInteger&,
0342 const TColStd_PackedMapOfInteger&);
0343
0344
0345
0346
0347
0348
0349
0350 Standard_EXPORT Standard_Boolean Intersect (const TColStd_PackedMapOfInteger&);
0351
0352
0353
0354
0355 TColStd_PackedMapOfInteger& operator &= (const TColStd_PackedMapOfInteger& MM)
0356 { Intersect(MM); return *this; }
0357
0358
0359
0360
0361
0362
0363
0364
0365 Standard_EXPORT void Subtraction (const TColStd_PackedMapOfInteger&,
0366 const TColStd_PackedMapOfInteger&);
0367
0368
0369
0370
0371
0372
0373
0374 Standard_EXPORT Standard_Boolean Subtract (const TColStd_PackedMapOfInteger&);
0375
0376
0377
0378
0379 TColStd_PackedMapOfInteger& operator -= (const TColStd_PackedMapOfInteger& MM)
0380 { Subtract(MM); return *this; }
0381
0382
0383
0384
0385
0386
0387
0388 Standard_EXPORT void Difference (const TColStd_PackedMapOfInteger&,
0389 const TColStd_PackedMapOfInteger&);
0390
0391
0392
0393
0394
0395
0396
0397 Standard_EXPORT Standard_Boolean Differ (const TColStd_PackedMapOfInteger&);
0398
0399
0400
0401
0402 TColStd_PackedMapOfInteger& operator ^= (const TColStd_PackedMapOfInteger& MM)
0403 { Differ(MM); return *this; }
0404
0405
0406
0407
0408
0409 Standard_EXPORT Standard_Boolean IsEqual (const TColStd_PackedMapOfInteger&) const;
0410
0411
0412
0413
0414 Standard_Boolean operator == (const TColStd_PackedMapOfInteger& MM) const
0415 { return IsEqual(MM); }
0416
0417
0418
0419
0420
0421
0422 Standard_EXPORT Standard_Boolean IsSubset (const TColStd_PackedMapOfInteger&) const;
0423
0424
0425
0426
0427 Standard_Boolean operator <= (const TColStd_PackedMapOfInteger& MM) const
0428 { return IsSubset(MM); }
0429
0430
0431
0432
0433 Standard_EXPORT Standard_Boolean HasIntersection (const TColStd_PackedMapOfInteger&) const;
0434
0435
0436
0437 protected:
0438
0439
0440 Standard_Boolean Resizable() const { return IsEmpty() || (myNbPackedMapNodes > myNbBuckets); }
0441
0442
0443 static Standard_Integer packedKeyIndex (Standard_Integer theKey) { return (unsigned)theKey >> 5; }
0444
0445 private:
0446
0447
0448
0449 Standard_EXPORT static Standard_Integer TColStd_intMapNode_findNext (const TColStd_intMapNode* theNode,
0450 unsigned int& theMask);
0451
0452
0453
0454 Standard_EXPORT static Standard_Integer TColStd_intMapNode_findPrev (const TColStd_intMapNode* theNode,
0455 unsigned int& theMask);
0456
0457
0458
0459
0460 static size_t TColStd_Population (unsigned int& theMask, unsigned int theData)
0461 {
0462 unsigned int aRes = theData - ((theData>>1) & 0x55555555);
0463 aRes = (aRes & 0x33333333) + ((aRes>>2) & 0x33333333);
0464 aRes = (aRes + (aRes>>4)) & 0x0f0f0f0f;
0465 aRes = aRes + (aRes>>8);
0466 aRes = aRes + (aRes>>16);
0467 theMask = (theMask & TColStd_PackedMapOfInteger::MASK_HIGH) | ((aRes - 1) & TColStd_PackedMapOfInteger::MASK_LOW);
0468 return size_t(aRes & 0x3f);
0469 }
0470
0471 private:
0472
0473 TColStd_intMapNode** myData1;
0474 Standard_Integer myNbBuckets;
0475 Standard_Integer myNbPackedMapNodes;
0476 Standard_Size myExtent;
0477 };
0478
0479 #endif