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 bae2af3..017c6c8 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 274c980..ea20e56 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 2fe17b5..5aba81b 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 40f4806..e07faa5 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 227bd4d..c4d9e8b 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 f441b55..46430a9 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();
 }
 
 //=======================================================================