1 // Copyright (c) 2017 OPEN CASCADE SAS
3 // This file is part of Open CASCADE Technology software library.
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
14 #include <StdStorage_BacketOfPersistent.hxx>
15 #include <StdObjMgt_Persistent.hxx>
17 StdStorage_Bucket::~StdStorage_Bucket()
19 Standard::Free(mySpace);
25 //=======================================================================
28 //=======================================================================
29 void StdStorage_Bucket::Clear()
34 //=======================================================================
37 //=======================================================================
38 void StdStorage_Bucket::Append(StdObjMgt_Persistent *sp)
41 mySpace[myCurrentSpace] = sp;
44 //=======================================================================
47 //=======================================================================
48 StdObjMgt_Persistent* StdStorage_Bucket::Value(const Standard_Integer theIndex) const
50 return mySpace[theIndex];
53 //=======================================================================
54 //function : Storage_BucketOfPersistent
56 //=======================================================================
57 StdStorage_BucketOfPersistent::StdStorage_BucketOfPersistent
58 (const Standard_Integer theBucketSize, const Standard_Integer theBucketNumber)
59 : myNumberOfBucket(1), myNumberOfBucketAllocated(theBucketNumber)
60 , myBucketSize(theBucketSize)
62 myBuckets = (StdStorage_Bucket**)Standard::Allocate
63 (sizeof(StdStorage_Bucket*) * theBucketNumber);
64 myBuckets[0] = new StdStorage_Bucket(myBucketSize);
65 myCurrentBucket = myBuckets[0];
67 myCurrentBucketNumber = 0;
70 //=======================================================================
73 //=======================================================================
74 void StdStorage_BucketOfPersistent::Clear()
79 for (i = 1; i < myNumberOfBucket; i++) delete myBuckets[i];
81 myCurrentBucket = myBuckets[0];
82 myCurrentBucket->Clear();
83 myCurrentBucketNumber = 0;
88 StdStorage_BucketOfPersistent::~StdStorage_BucketOfPersistent()
92 Standard::Free(myBuckets);
96 //=======================================================================
99 //=======================================================================
100 StdObjMgt_Persistent* StdStorage_BucketOfPersistent::Value
101 (const Standard_Integer theIndex)
103 Standard_Integer theInd, theCurrentBucketNumber, tecurrentind = theIndex - 1;
104 theCurrentBucketNumber = tecurrentind / myBucketSize;
105 theInd = tecurrentind - (myBucketSize * theCurrentBucketNumber);
107 return myBuckets[theCurrentBucketNumber]->mySpace[theInd];
110 //=======================================================================
113 //=======================================================================
114 void StdStorage_BucketOfPersistent::Append(const Handle(StdObjMgt_Persistent)& sp)
116 myCurrentBucket->myCurrentSpace++;
118 if (myCurrentBucket->myCurrentSpace != myBucketSize) {
120 myCurrentBucket->mySpace[myCurrentBucket->myCurrentSpace] = sp.operator->();
124 myCurrentBucket->myCurrentSpace--;
126 myCurrentBucketNumber++;
128 if (myNumberOfBucket > myNumberOfBucketAllocated) {
129 Standard_Size e = sizeof(StdStorage_Bucket*) * myNumberOfBucketAllocated;
130 myBuckets = (StdStorage_Bucket**)Standard::Reallocate(myBuckets, e * 2);
131 myNumberOfBucketAllocated *= 2;
134 myBuckets[myCurrentBucketNumber] = new StdStorage_Bucket(myBucketSize);
135 myCurrentBucket = myBuckets[myCurrentBucketNumber];
136 myCurrentBucket->myCurrentSpace++;
138 myCurrentBucket->mySpace[myCurrentBucket->myCurrentSpace] = sp.operator->();
141 //=======================================================================
142 //function : Storage_BucketIterator
144 //=======================================================================
145 StdStorage_BucketIterator::StdStorage_BucketIterator
146 (StdStorage_BucketOfPersistent* aBucketManager)
148 if (aBucketManager) {
149 myBucket = aBucketManager;
150 myCurrentBucket = myBucket->myBuckets[0];
151 myBucketNumber = aBucketManager->myNumberOfBucket;
152 myCurrentBucketIndex = 0;
154 myMoreObject = Standard_True;
156 else myMoreObject = Standard_False;
159 //=======================================================================
162 //=======================================================================
163 void StdStorage_BucketIterator::Reset()
166 myCurrentBucket = myBucket->myBuckets[0];
167 myBucketNumber = myBucket->myNumberOfBucket;
169 myCurrentBucketIndex = 0;
170 myMoreObject = Standard_True;
172 else myMoreObject = Standard_False;
175 //=======================================================================
178 //=======================================================================
179 void StdStorage_BucketIterator::Init(StdStorage_BucketOfPersistent* aBucketManager)
181 if (aBucketManager) {
182 myBucket = aBucketManager;
183 myCurrentBucket = myBucket->myBuckets[0];
184 myBucketNumber = aBucketManager->myNumberOfBucket;
186 myCurrentBucketIndex = 0;
187 myMoreObject = Standard_True;
189 else myMoreObject = Standard_False;
192 //=======================================================================
195 //=======================================================================
196 void StdStorage_BucketIterator::Next()
198 if (!myMoreObject) return;
200 if (myCurrentIndex < myCurrentBucket->myCurrentSpace) {
205 myCurrentBucketIndex++;
206 if (myCurrentBucketIndex < myBucketNumber) {
207 myCurrentBucket = myBucket->myBuckets[myCurrentBucketIndex];
210 myMoreObject = Standard_False;