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>
21 #include <Standard_Persistent.hxx>
23 // taille a partir de laquelle la tableau cre son propre container
25 #define DBC_TAILLE_PLAFOND_CREATION_SEGMENT 10000
27 #include <StandardOBJS_PersistentMacro.hxx>
28 #include <StandardOBJS_PrimitiveTypes.hxx>
30 // just use for internal generic identifiaction of Item
32 static PStandard_ArrayNode DBC_tmpItem;
37 #include <StandardOBJS_PersistentMacro.hxx>
40 DBC_VArray::DBC_VArray() : DBC_BaseArray()
47 DBC_VArray::DBC_VArray(const Standard_Integer Size) : DBC_BaseArray(Size)
51 myData = (DBC_VArrayTNode*)Standard::Allocate(Size * sizeof(DBC_VArrayTNode));
52 DBC_VArrayTNode* ptrtmp = (DBC_VArrayTNode*)myData;
53 for (int i = 0; i < Size; i++) {
54 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
58 // myData = new DBC_VArrayTNode[Size];
62 myData = new (os_segment::of(this),DBC_VArrayNode::get_os_typespec(),Size) DBC_VArrayNode[Size];
75 DBC_VArray::DBC_VArray(const DBC_VArray& Varray) : DBC_BaseArray(Varray)
78 //myData = new DBC_VArrayTNode[mySize];
80 myData = (DBC_VArrayTNode*)Standard::Allocate(mySize * sizeof(DBC_VArrayTNode));
81 DBC_VArrayTNode* ptrtmp = (DBC_VArrayTNode*)myData;
83 for(Standard_Integer i=0; i<mySize; i++) {
84 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
85 ((DBC_VArrayTNode*)myData)[i] = ((DBC_VArrayTNode*)Varray.myData)[i];
90 myData = new (os_segment::of(this),DBC_VArrayNode::get_os_typespec(),mySize) DBC_VArrayNode[mySize] ;
91 const DBC_VArrayNode* otherArray = (DBC_VArrayNode*)Varray.myData;
93 for(Standard_Integer i=0; i<mySize; i++) {
94 ((DBC_VArrayNode*)myData)[i].SetValue(*((Item*)(otherArray[i].Value())));
99 // --------------------------------------------------------------------
101 // --------------------------------------------------------------------
102 void DBC_VArray::Resize (const Standard_Integer NewSize)
104 Standard_NegativeValue_Raise_if((NewSize < 0),
105 "DBC_VArray::Resize with a bad size");
108 myData.resize((unsigned int)NewSize) ;
113 Standard_Integer borne;
115 INTERNAL_MODE_OODB_START {
116 os_segment *seg = Storage_CurrentContainer();
117 newData = Standard_PersistentAllocation(DBC_tmpItem, NewSize);
118 if ( NewSize < mySize ) {
124 for( Standard_Integer i=0; i<borne;i++ ) {
125 newData[i] = myData[i];
128 delete (PStandard_ArrayNode*) myData;
130 Storage_CurrentContainer() = seg;
132 INTERNAL_MODE_OODB_END;
136 if (NewSize > mySize) {
138 DBC_VArrayNode* ptr = new (os_segment::of(this),DBC_VArrayNode::get_os_typespec(),NewSize) DBC_VArrayNode[NewSize] ;
139 for(i = 0; i < mySize; i++) {
140 ((DBC_VArrayNode*)ptr)[i].SetValue(*((Item*)(((DBC_VArrayNode*)myData)[i].Value())));
143 if (myData) delete [] myData; // free old area.
149 if(NewSize > mySize || !NewSize){
152 DBC_VArrayTNode* ptr = 0L;
154 ptr = (DBC_VArrayTNode*)Standard::Allocate(NewSize * sizeof(DBC_VArrayTNode));
157 DBC_VArrayTNode* ptrtmp = ptr;
161 for(i = 0; i < mySize; i++) {
162 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
163 ptr[i].SetValue(*((Item *)((DBC_VArrayTNode*)myData)[i].Value()));
168 ptrtmp = (DBC_VArrayTNode*)myData;
169 for(i = 0; i < mySize; i++) {
170 ptrtmp->DBC_VArrayTNode::~DBC_VArrayTNode();
173 Standard::Free(myData);
175 for(i = 0; i < NewSize; i++) {
176 ptrtmp = new((Standard_Address)ptrtmp) DBC_VArrayTNode();
187 // --------------------------------------------------------------------
189 // --------------------------------------------------------------------
191 Item& DBC_VArray::Value( const Standard_Integer Index) const
193 Standard_OutOfRange_Raise_if((Index < 0 || Index >= mySize),
194 "Index out of range in VArray::Value");
196 Handle(DBC_VArrayNode) theNode = Handle(DBC_VArrayNode)::DownCast(myData.elem((unsigned int)Index));
197 return *((Item *)theNode->Value());
201 return myData[Index];
205 return *((Item*)(((DBC_VArrayNode*)myData)[Index].Value()));
209 return *((Item *)((DBC_VArrayTNode*)myData)[Index].Value());
213 void DBC_VArray::Assign (const DBC_VArray& Right)
216 myData.operator=(Right.myData);
220 INTERNAL_MODE_OODB_START {
221 for(Standard_Integer i=0; i< mySize; i++){
222 ((DBC_VArrayNode*)myData)[i].SetValue(*((Item*)(((DBC_VArrayNode*)Right.myData)[i].Value())));
225 INTERNAL_MODE_OODB_END;
231 for(i = 0; i < mySize; i++) {
232 ((DBC_VArrayTNode*)myData)[i].SetValue(*((Item *)((DBC_VArrayTNode*)Right.myData)[i].Value()));
238 // --------------------------------------------------------------------
240 // --------------------------------------------------------------------
241 void DBC_VArray::SetValue(const Standard_Integer Index, const Item& Value)
243 Standard_OutOfRange_Raise_if((Index < 0 || Index >= mySize),
244 "Index out of range in VArray::SetValue");
246 if (myData.elem((unsigned int)Index).IsNull())
248 Handle(DBC_VArrayNode) theNode = new DBC_VArrayNode;
249 myData.elem((unsigned int)Index) = theNode;
250 theNode->SetValue(Value);
254 Handle(DBC_VArrayNode) theNode = Handle(DBC_VArrayNode)::DownCast(myData.elem((unsigned int)Index));
255 theNode->SetValue(Value);
260 INTERNAL_MODE_OODB_START {
261 myData[Index] = Value;
263 INTERNAL_MODE_OODB_END;
267 ((DBC_VArrayNode*)myData)[Index].SetValue(Value);
271 ((DBC_VArrayTNode*)myData)[Index].SetValue(Value);
275 void DBC_VArray::Destroy()
278 if (myData && mySize > 0) {
279 DBC_VArrayTNode* ptrtmp = (DBC_VArrayTNode*)myData;
280 for(Standard_Integer i = 0; i < mySize; i++) {
281 ptrtmp->DBC_VArrayTNode::~DBC_VArrayTNode();
284 Standard::Free(myData);