]> OCCT Git - occt-copy.git/commitdiff
OCC18056 Exception during copying Array attribute with array(0,0)
authorSZY <>
Thu, 28 Apr 2011 15:40:24 +0000 (15:40 +0000)
committerbugmaster <bugmaster@opencascade.com>
Mon, 5 Mar 2012 15:28:08 +0000 (19:28 +0400)
src/TDataStd/TDataStd_ByteArray.cxx
src/TDataStd/TDataStd_ExtStringArray.cxx
src/TDataStd/TDataStd_IntegerArray.cxx
src/TDataStd/TDataStd_RealArray.cxx
src/TDataStd/TDataStd_ReferenceArray.cdl
src/TDataStd/TDataStd_ReferenceArray.cxx

index bae2af3f590e7959826b4c9e62e076608e7c1c39..017c6c8fe49da9d9b3160cf6063c6724a91b5d0a 100755 (executable)
@@ -128,7 +128,7 @@ void TDataStd_ByteArray::ChangeArray (const Handle(TColStd_HArray1OfByte)& newAr
   Standard_Boolean aDimEqual = Standard_False;
   Standard_Integer i;
 
-  if ((Lower() || Upper()) && Lower() == aLower && Upper() == anUpper ) {
+  if ( Lower() == aLower && Upper() == anUpper ) {
     aDimEqual = Standard_True;
     if(isCheckItems) {
       Standard_Boolean isEqual = Standard_True;
@@ -145,7 +145,7 @@ void TDataStd_ByteArray::ChangeArray (const Handle(TColStd_HArray1OfByte)& newAr
   
   Backup();
 // Handles of myValue of current and backuped attributes will be different!
-  if(!aDimEqual) 
+  if(myValue.IsNull() || !aDimEqual) 
     myValue = new TColStd_HArray1OfByte(aLower, anUpper);  
 
   for(i = aLower; i <= anUpper; i++) 
index 274c980c1562c48a8bdb1ef6da3b5c36bd53c5e7..ea20e56069aa11e4304e99d932d7e212d87c147f 100755 (executable)
@@ -145,7 +145,7 @@ void TDataStd_ExtStringArray::ChangeArray(const Handle(TColStd_HArray1OfExtended
   Standard_Boolean aDimEqual = Standard_False;
   Standard_Integer i;
 
-  if ((Lower() || Upper()) && Lower() == aLower && Upper() == anUpper ) {
+  if (Lower() == aLower && Upper() == anUpper ) {
     aDimEqual = Standard_True;
     Standard_Boolean isEqual = Standard_True;
     if(isCheckItems) {
@@ -163,7 +163,7 @@ void TDataStd_ExtStringArray::ChangeArray(const Handle(TColStd_HArray1OfExtended
   Backup();
 
 // Handles of myValue of current and backuped attributes will be different!!!
-  if(!aDimEqual) 
+  if(myValue.IsNull() || !aDimEqual) 
     myValue = new TColStd_HArray1OfExtendedString(aLower, anUpper);
 
   for(i = aLower; i <= anUpper; i++) 
index 2fe17b5d387b2f82f4bc62250a61b2148fb680d1..5aba81b5637f5782c7f438358131a2bb1a72826d 100755 (executable)
@@ -145,7 +145,8 @@ void TDataStd_IntegerArray::ChangeArray(const Handle(TColStd_HArray1OfInteger)&
   Standard_Boolean aDimEqual = Standard_False;
   Standard_Integer i;
 #ifdef OCC2932
-  if ((Lower() || Upper()) && Lower() == aLower && Upper() == anUpper ) {
+
+  if(Lower() == aLower && Upper() == anUpper ) {
     aDimEqual = Standard_True;
     if(isCheckItems) {
       Standard_Boolean isEqual = Standard_True;
@@ -163,7 +164,7 @@ void TDataStd_IntegerArray::ChangeArray(const Handle(TColStd_HArray1OfInteger)&
   
   Backup();
 // Handles of myValue of current and backuped attributes will be different!
-  if(!aDimEqual) 
+  if(myValue.IsNull() || !aDimEqual) 
     myValue = new TColStd_HArray1OfInteger(aLower, anUpper);  
 
   for(i = aLower; i <= anUpper; i++) 
index 40f480620149c7a282c6e3786255fd4efa5e5a53..e07faa55f5a89371ac900bd1bb79d7317b8b6538 100755 (executable)
@@ -146,7 +146,7 @@ void TDataStd_RealArray::ChangeArray(const Handle(TColStd_HArray1OfReal)& newArr
   Standard_Integer i;
 
 #ifdef OCC2932
-  if ((Lower() || Upper()) && Lower() == aLower && Upper() == anUpper ) {
+  if (Lower() == aLower && Upper() == anUpper ) {
     aDimEqual = Standard_True;
     Standard_Boolean isEqual = Standard_True;
     if(isCheckItems) {
@@ -164,7 +164,7 @@ void TDataStd_RealArray::ChangeArray(const Handle(TColStd_HArray1OfReal)& newArr
 
   Backup();
 
-  if(!aDimEqual) 
+  if(myValue.IsNull() || !aDimEqual) 
     myValue = new TColStd_HArray1OfReal(aLower, anUpper);
 
   for(i = aLower; i <= anUpper; i++) 
index 227bd4d67251b2d5f498b79f3fc703dbf44ae59f..c4d9e8b43c6f08186224954a19bb4ce8f78d5912 100755 (executable)
@@ -73,7 +73,8 @@ is
     returns HLabelArray1 from TDataStd;
     
     SetInternalArray (me : mutable;
-                     values : HLabelArray1 from TDataStd);
+                     values : HLabelArray1 from TDataStd;
+                     isCheckItems : Boolean = Standard_True);
 
 
     ---Category: Methodes of TDF_Attribute
index f441b55c8909ea57f5a8829ce713bc3df662ecf2..46430a9c95c387b7390c0d8a9daebe7f81e70904 100755 (executable)
@@ -32,10 +32,9 @@ TDataStd_ReferenceArray::TDataStd_ReferenceArray()
 void TDataStd_ReferenceArray::Init(const Standard_Integer lower,
                                   const Standard_Integer upper)
 {
+  Standard_RangeError_Raise_if(upper < lower,"TDataStd_ReferenceArray::Init");
   Backup();
-
-  if (upper >= lower)
-    myArray = new TDataStd_HLabelArray1(lower, upper);
+  myArray = new TDataStd_HLabelArray1(lower, upper);
 }
 
 //=======================================================================
@@ -130,9 +129,39 @@ const Handle(TDataStd_HLabelArray1)& TDataStd_ReferenceArray::InternalArray () c
 //function : SetInternalArray
 //purpose  : 
 //=======================================================================
-void TDataStd_ReferenceArray::SetInternalArray (const Handle(TDataStd_HLabelArray1)& values)
+void TDataStd_ReferenceArray::SetInternalArray (const Handle(TDataStd_HLabelArray1)& values,
+                                               const Standard_Boolean isCheckItem)
 {
-  myArray = values;
+//  myArray = values;
+  Standard_Integer aLower    = values->Lower();
+  Standard_Integer anUpper   = values->Upper();
+  Standard_Boolean aDimEqual = Standard_False;
+  Standard_Integer i;
+
+#ifdef OCC2932
+  if (Lower() == aLower && Upper() == anUpper ) {
+    aDimEqual = Standard_True;
+    Standard_Boolean isEqual = Standard_True;
+    if(isCheckItems) {
+      for(i = aLower; i <= anUpper; i++) {
+       if(myArray->Value(i) != values->Value(i)) {
+         isEqual = Standard_False;
+         break;
+       }
+      }
+      if(isEqual)
+       return;
+    }
+  }
+#endif
+
+  Backup();
+
+  if(myArray.IsNull() || !aDimEqual) 
+    myArray = new TDataStd_HLabelArray1(aLower, anUpper);
+
+  for(i = aLower; i <= anUpper; i++) 
+    myArray->SetValue(i, values->Value(i));
 }
 
 //=======================================================================
@@ -141,7 +170,7 @@ void TDataStd_ReferenceArray::SetInternalArray (const Handle(TDataStd_HLabelArra
 //=======================================================================
 const Standard_GUID& TDataStd_ReferenceArray::ID () const 
 { 
-  return GetID(); 
+  return GetID();
 }
 
 //=======================================================================