1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
15 #include <Standard_OutOfRange.hxx>
16 #include <Standard_NegativeValue.hxx>
17 #include <Standard_NullObject.hxx>
18 #include <Standard_NotImplemented.hxx>
23 #include <Standard_Persistent.hxx>
25 // taille a partir de laquelle la tableau cre son propre container
27 #define DBC_TAILLE_PLAFOND_CREATION_SEGMENT 10000
29 #include <StandardOBJS_PersistentMacro.hxx>
30 #include <StandardOBJS_PrimitiveTypes.hxx>
32 // just use for internal generic identifiaction of Item
34 static PStandard_ArrayNode DBC_tmpItem;
39 #include <StandardOBJS_PersistentMacro.hxx>
42 DBC_VArray::DBC_VArray() : DBC_BaseArray()
49 DBC_VArray::DBC_VArray(const Standard_Integer Size) : DBC_BaseArray(Size)
55 myData = (DBC_VArrayTNode*)Standard::Allocate(Size * sizeof(DBC_VArrayTNode));
56 DBC_VArrayTNode* ptrtmp = (DBC_VArrayTNode*)myData;
57 for (int i = 0; i < Size; i++) {
58 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
62 // myData = new DBC_VArrayTNode[Size];
66 myData = new (os_segment::of(this),DBC_VArrayNode::get_os_typespec(),Size) DBC_VArrayNode[Size];
81 DBC_VArray::DBC_VArray(const DBC_VArray& Varray) : DBC_BaseArray(Varray)
84 //myData = new DBC_VArrayTNode[mySize];
86 myData = (DBC_VArrayTNode*)Standard::Allocate(mySize * sizeof(DBC_VArrayTNode));
87 DBC_VArrayTNode* ptrtmp = (DBC_VArrayTNode*)myData;
89 for(Standard_Integer i=0; i<mySize; i++) {
90 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
91 ((DBC_VArrayTNode*)myData)[i] = ((DBC_VArrayTNode*)Varray.myData)[i];
96 myData = new (os_segment::of(this),DBC_VArrayNode::get_os_typespec(),mySize) DBC_VArrayNode[mySize] ;
97 const DBC_VArrayNode* otherArray = (DBC_VArrayNode*)Varray.myData;
99 for(Standard_Integer i=0; i<mySize; i++) {
100 ((DBC_VArrayNode*)myData)[i].SetValue(*((Item*)(otherArray[i].Value())));
105 // --------------------------------------------------------------------
107 // --------------------------------------------------------------------
108 void DBC_VArray::Resize (const Standard_Integer NewSize)
110 Standard_NegativeValue_Raise_if((NewSize < 0),
111 "DBC_VArray::Resize with a bad size");
114 myData.resize((unsigned int)NewSize) ;
119 Standard_Integer borne;
121 INTERNAL_MODE_OODB_START {
122 os_segment *seg = Storage_CurrentContainer();
123 newData = Standard_PersistentAllocation(DBC_tmpItem, NewSize);
124 if ( NewSize < mySize ) {
130 for( Standard_Integer i=0; i<borne;i++ ) {
131 newData[i] = myData[i];
134 delete (PStandard_ArrayNode*) myData;
136 Storage_CurrentContainer() = seg;
138 INTERNAL_MODE_OODB_END;
142 if (NewSize > mySize) {
144 DBC_VArrayNode* ptr = new (os_segment::of(this),DBC_VArrayNode::get_os_typespec(),NewSize) DBC_VArrayNode[NewSize] ;
145 for(i = 0; i < mySize; i++) {
146 ((DBC_VArrayNode*)ptr)[i].SetValue(*((Item*)(((DBC_VArrayNode*)myData)[i].Value())));
149 if (myData) delete [] myData; // free old area.
155 if(NewSize > mySize || !NewSize){
158 DBC_VArrayTNode* ptr = 0L;
160 ptr = (DBC_VArrayTNode*)Standard::Allocate(NewSize * sizeof(DBC_VArrayTNode));
163 DBC_VArrayTNode* ptrtmp = ptr;
167 for(i = 0; i < mySize; i++) {
168 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
169 ptr[i].SetValue(*((Item *)((DBC_VArrayTNode*)myData)[i].Value()));
174 ptrtmp = (DBC_VArrayTNode*)myData;
175 for(i = 0; i < mySize; i++) {
176 ptrtmp->DBC_VArrayTNode::~DBC_VArrayTNode();
179 Standard::Free(myData);
181 for(i = 0; i < NewSize; i++) {
182 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
193 // --------------------------------------------------------------------
195 // --------------------------------------------------------------------
197 Item& DBC_VArray::Value( const Standard_Integer Index) const
199 Standard_OutOfRange_Raise_if((Index < 0 || Index >= mySize),
200 "Index out of range in VArray::Value");
202 Handle(DBC_VArrayNode) theNode = Handle(DBC_VArrayNode)::DownCast(myData.elem((unsigned int)Index));
203 return *((Item *)theNode->Value());
207 return myData[Index];
211 return *((Item*)(((DBC_VArrayNode*)myData)[Index].Value()));
215 return *((Item *)((DBC_VArrayTNode*)myData)[Index].Value());
219 void DBC_VArray::Assign (const DBC_VArray& Right)
222 myData.operator=(Right.myData);
226 INTERNAL_MODE_OODB_START {
227 for(Standard_Integer i=0; i< mySize; i++){
228 ((DBC_VArrayNode*)myData)[i].SetValue(*((Item*)(((DBC_VArrayNode*)Right.myData)[i].Value())));
231 INTERNAL_MODE_OODB_END;
237 for(i = 0; i < mySize; i++) {
238 ((DBC_VArrayTNode*)myData)[i].SetValue(*((Item *)((DBC_VArrayTNode*)Right.myData)[i].Value()));
244 // --------------------------------------------------------------------
246 // --------------------------------------------------------------------
247 void DBC_VArray::SetValue(const Standard_Integer Index, const Item& Value)
249 Standard_OutOfRange_Raise_if((Index < 0 || Index >= mySize),
250 "Index out of range in VArray::SetValue");
252 if (myData.elem((unsigned int)Index).IsNull())
254 Handle(DBC_VArrayNode) theNode = new DBC_VArrayNode;
255 myData.elem((unsigned int)Index) = theNode;
256 theNode->SetValue(Value);
260 Handle(DBC_VArrayNode) theNode = Handle(DBC_VArrayNode)::DownCast(myData.elem((unsigned int)Index));
261 theNode->SetValue(Value);
266 INTERNAL_MODE_OODB_START {
267 myData[Index] = Value;
269 INTERNAL_MODE_OODB_END;
273 ((DBC_VArrayNode*)myData)[Index].SetValue(Value);
277 ((DBC_VArrayTNode*)myData)[Index].SetValue(Value);
281 void DBC_VArray::Destroy()
285 if (myData && mySize > 0) {
289 DBC_VArrayTNode* ptrtmp = (DBC_VArrayTNode*)myData;
290 for(Standard_Integer i = 0; i < mySize; i++) {
291 ptrtmp->DBC_VArrayTNode::~DBC_VArrayTNode();
294 Standard::Free(myData);