0022627: Change OCCT memory management defaults
[occt.git] / src / TDataStd / TDataStd_DeltaOnModificationOfExtStringArray.cxx
1 // File:        TDataStd_DeltaOnModificationOfExtStringArray.cxx
2 // Created:     Tue Dec  4 17:48:47 2007
3 // Author:      Sergey ZARITCHNY
4 //              <sergey.zaritchny@opencascade.com>
5 //Copyright:    Open CasCade SA 2007
6
7 #include <TDataStd_DeltaOnModificationOfExtStringArray.ixx>
8 #include <TDataStd_ExtStringArray.hxx>
9 #include <TDF_DeltaOnModification.hxx>
10 #include <TDF_Label.hxx>
11 #include <TColStd_HArray1OfExtendedString.hxx>
12 #include <TColStd_ListOfInteger.hxx>
13 #include <TColStd_ListIteratorOfListOfInteger.hxx>
14 #include <TDF_AttributeIterator.hxx>
15
16 #ifdef DEB
17 #define MAXUP 1000
18 #endif
19 //=======================================================================
20 //function : TDataStd_DeltaOnModificationOfExtStringArray
21 //purpose  : 
22 //=======================================================================
23
24 TDataStd_DeltaOnModificationOfExtStringArray::TDataStd_DeltaOnModificationOfExtStringArray(const Handle(TDataStd_ExtStringArray)& OldAtt)
25 : TDF_DeltaOnModification(OldAtt)
26 {
27   Handle(TDataStd_ExtStringArray) CurrAtt;
28   if (Label().FindAttribute(OldAtt->ID(),CurrAtt)) {
29     {
30       Handle(TColStd_HArray1OfExtendedString) Arr1, Arr2;
31       Arr1 = OldAtt->Array();
32       Arr2 = CurrAtt->Array();
33 #ifdef DEB
34       if(Arr1.IsNull())
35         cout <<"DeltaOnModificationOfExtStringArray:: Old IntArray is Null" <<endl;
36       if(Arr2.IsNull())
37         cout <<"DeltaOnModificationOfExtStringArray:: Current IntArray is Null" <<endl;
38 #endif
39
40       if(Arr1.IsNull() || Arr2.IsNull()) return;
41       if(Arr1 != Arr2) {
42         myUp1 = Arr1->Upper();
43         myUp2 = Arr2->Upper();
44         Standard_Integer i, N =0, aCase=0; 
45         if(myUp1 == myUp2) 
46           {aCase = 1; N = myUp1;}
47         else if(myUp1 < myUp2) 
48           {aCase = 2; N = myUp1;}
49         else 
50           {aCase = 3; N = myUp2;}//Up1 > Up2
51
52         TColStd_ListOfInteger aList;
53         for(i=Arr1->Lower();i <= N; i++)
54           if(Arr1->Value(i) != Arr2->Value(i)) 
55             aList.Append(i);
56         if(aCase == 3) {
57           for(i = N+1;i <= myUp1; i++)
58             aList.Append(i);
59         }
60
61         if(aList.Extent()) {
62           myIndxes = new TColStd_HArray1OfInteger(1,aList.Extent());
63           myValues = new TColStd_HArray1OfExtendedString(1,aList.Extent());
64           TColStd_ListIteratorOfListOfInteger anIt(aList);
65           for(i =1;anIt.More();anIt.Next(),i++) {
66             myIndxes->SetValue(i, anIt.Value());
67             myValues->SetValue(i, Arr1->Value(anIt.Value()));
68           }
69         }
70       }
71     }
72     OldAtt->RemoveArray();
73 #ifdef DEB
74     if(OldAtt->Array().IsNull())
75       cout << "BackUp Arr is Nullified" << endl;
76 #endif
77   }
78 }
79
80
81 //=======================================================================
82 //function : Apply
83 //purpose  : 
84 //=======================================================================
85
86 void TDataStd_DeltaOnModificationOfExtStringArray::Apply()
87 {
88
89   Handle(TDF_Attribute) TDFAttribute = Attribute();
90   Handle(TDataStd_ExtStringArray) BackAtt = (*((Handle(TDataStd_ExtStringArray)*)&TDFAttribute));
91   if(BackAtt.IsNull()) {
92 #ifdef DEB
93     cout << "DeltaOnModificationOfExtStringArray::Apply: OldAtt is Null" <<endl;
94 #endif
95     return;
96   }
97   
98   Handle(TDataStd_ExtStringArray) aCurAtt;
99   if (!Label().FindAttribute(BackAtt->ID(),aCurAtt)) {
100
101     Label().AddAttribute(BackAtt);
102   }
103
104   if(aCurAtt.IsNull()) {
105 #ifdef DEB
106     cout << "DeltaOnModificationOfExtStringArray::Apply: CurAtt is Null" <<endl;
107 #endif
108     return;
109   }
110   else 
111     aCurAtt->Backup();
112
113   Standard_Integer aCase;
114   if(myUp1 == myUp2) 
115     aCase = 1;
116   else if(myUp1 < myUp2) 
117     aCase = 2;
118   else 
119     aCase = 3;//Up1 > Up2
120
121   if (aCase == 1 && (myIndxes.IsNull() || myValues.IsNull()))
122     return;
123   
124   Standard_Integer i;
125   Handle(TColStd_HArray1OfExtendedString) aStrArr = aCurAtt->Array();
126   if(aStrArr.IsNull()) return;
127
128   if(aCase == 1)   
129     for(i = 1; i <= myIndxes->Upper();i++) 
130       aStrArr->ChangeArray1().SetValue(myIndxes->Value(i), myValues->Value(i));
131   else if(aCase == 2) {    
132     Handle(TColStd_HArray1OfExtendedString) strArr = 
133       new TColStd_HArray1OfExtendedString(aStrArr->Lower(), myUp1);
134     for(i = aStrArr->Lower(); i <= myUp1 && i <= aStrArr->Upper(); i++) 
135       strArr->SetValue(i, aStrArr->Value(i));
136     if(!myIndxes.IsNull() && !myValues.IsNull())
137       for(i = 1; i <= myIndxes->Upper();i++) 
138         strArr->ChangeArray1().SetValue(myIndxes->Value(i), myValues->Value(i));
139     aCurAtt->myValue = strArr;
140   }
141   else { // == 3
142     Standard_Integer low = aStrArr->Lower();
143     Handle(TColStd_HArray1OfExtendedString) strArr = 
144       new TColStd_HArray1OfExtendedString(low, myUp1);
145     for(i = aStrArr->Lower(); i <= myUp2 && i <= aStrArr->Upper(); i++) 
146       strArr->SetValue(i, aStrArr->Value(i));
147     if(!myIndxes.IsNull() && !myValues.IsNull())
148       for(i = 1; i <= myIndxes->Upper();i++) {
149 #ifdef DEB  
150         cout << "i = " << i << "  myIndxes->Upper = " << myIndxes->Upper() << endl;
151         cout << "myIndxes->Value(i) = " << myIndxes->Value(i) << endl;
152         cout << "myValues->Value(i) = " << myValues->Value(i) << endl;
153 #endif
154         strArr->ChangeArray1().SetValue(myIndxes->Value(i), myValues->Value(i));      
155       }
156     aCurAtt->myValue = strArr;
157   }
158
159   
160 #ifdef DEB
161   cout << " << Array Dump after Delta Apply >>" <<endl;
162   Handle(TColStd_HArray1OfExtendedString) aStrArr2 = aCurAtt->Array();
163   for(i=aStrArr2->Lower(); i<= aStrArr2->Upper() && i<= MAXUP;i++)
164     cout << aStrArr2->Value(i) << "  ";
165   cout <<endl;
166 #endif
167 }
168
169