Integration of OCCT 6.5.0 from SVN
[occt.git] / src / TDataStd / TDataStd_DeltaOnModificationOfIntPackedMap.cxx
1 // File:        TDataStd_DeltaOnModificationOfIntPackedMap.cxx
2 // Created:     Wed Jan 23 11:05:47 2008
3 // Author:      Sergey ZARITCHNY
4 //              <sergey.zaritchny@opencascade.com>
5 //Copyright:    Open CasCade SA 2008
6
7 #include <TDataStd_DeltaOnModificationOfIntPackedMap.ixx>
8 #include <TDF_DeltaOnModification.hxx>
9 #include <TDF_Label.hxx>
10 #include <TColStd_PackedMapOfInteger.hxx>
11 #include <TColStd_HPackedMapOfInteger.hxx>
12 #include <TColStd_MapIteratorOfPackedMapOfInteger.hxx>
13
14 #ifdef DEB
15 #define MAXUP 1000
16 #endif
17
18 //=======================================================================
19 //function : TDataStd_DeltaOnModificationOfIntPackedMap
20 //purpose  : 
21 //=======================================================================
22
23 TDataStd_DeltaOnModificationOfIntPackedMap::TDataStd_DeltaOnModificationOfIntPackedMap(
24                              const Handle(TDataStd_IntPackedMap)& OldAtt)
25 : TDF_DeltaOnModification(OldAtt)
26 {
27   Handle(TDataStd_IntPackedMap) CurrAtt;
28   if (Label().FindAttribute(OldAtt->ID(),CurrAtt)) {
29     {
30       Handle(TColStd_HPackedMapOfInteger) aMap1, aMap2;
31       aMap1 = OldAtt->GetHMap();
32       aMap2 = CurrAtt->GetHMap();
33 #ifdef DEB
34       if(aMap1.IsNull())
35         cout <<"DeltaOnModificationOfIntPackedMap:: Old Map is Null" <<endl;
36       if(aMap2.IsNull())
37         cout <<"DeltaOnModificationOfIntPackedMap:: Current Map is Null" <<endl;
38 #endif
39       
40       if(aMap1.IsNull() || aMap2.IsNull()) return;
41       if(aMap1 != aMap2) {
42         if(!aMap1->Map().HasIntersection(aMap2->Map()))
43           return; // no intersection: use full-scale backup
44
45         if(aMap1->Map().IsSubset(aMap2->Map())) { 
46           myDeletion = new TColStd_HPackedMapOfInteger();
47           myDeletion->ChangeMap().Subtraction(aMap2->Map(), aMap1->Map());
48         } else if(aMap2->Map().IsSubset(aMap1->Map())) { 
49           myAddition = new TColStd_HPackedMapOfInteger();
50           myAddition->ChangeMap().Subtraction(aMap1->Map(), aMap2->Map());
51         } else {
52           myAddition = new TColStd_HPackedMapOfInteger();
53           myAddition->ChangeMap().Subtraction(aMap1->Map(), aMap2->Map());
54           myDeletion = new TColStd_HPackedMapOfInteger();
55           myDeletion->ChangeMap().Subtraction(aMap2->Map(), aMap1->Map());
56         }
57       }
58     }
59     OldAtt->RemoveMap();
60 #ifdef DEB
61     if(OldAtt->GetHMap().IsNull())
62       cout << "BackUp Arr is Nullified" << endl;
63 #endif
64   }
65 }
66
67
68 //=======================================================================
69 //function : Apply
70 //purpose  : 
71 //=======================================================================
72
73 void TDataStd_DeltaOnModificationOfIntPackedMap::Apply()
74 {
75
76   Handle(TDF_Attribute) aTDFAttribute = Attribute();
77   Handle(TDataStd_IntPackedMap) aBackAtt = (*((Handle(TDataStd_IntPackedMap)*)&aTDFAttribute));
78   if(aBackAtt.IsNull()) {
79 #ifdef DEB
80     cout << "DeltaOnModificationOfIntPAckedMap::Apply: OldAtt is Null" <<endl;
81 #endif
82     return;
83   }
84   
85   Handle(TDataStd_IntPackedMap) aCurAtt;
86   if (!Label().FindAttribute(aBackAtt->ID(),aCurAtt)) {
87
88     Label().AddAttribute(aBackAtt);
89   }
90
91   if(aCurAtt.IsNull()) {
92 #ifdef DEB
93     cout << "DeltaOnModificationOfIntAPckedMAp::Apply: CurAtt is Null" <<endl;
94 #endif
95     return;
96   }
97   else 
98     aCurAtt->Backup();
99
100   
101   
102   Handle(TColStd_HPackedMapOfInteger) IntMap = aCurAtt->GetHMap();
103   if(IntMap.IsNull()) return;
104
105   if(myDeletion.IsNull() && myAddition.IsNull())
106     return;
107   else {
108     if(!myDeletion.IsNull()) {
109   
110       if(myDeletion->Map().Extent())
111         IntMap->ChangeMap().Subtract(myDeletion->Map());
112     } 
113     if(!myAddition.IsNull()) {
114       if(myAddition->Map().Extent())
115         IntMap->ChangeMap().Unite(myAddition->Map());
116     }
117   }
118   
119 #ifdef DEB    
120   cout << " << Map Dump after Delta Apply >>" <<endl;
121   Handle(TColStd_HPackedMapOfInteger) aIntMap = aCurAtt->GetHMap();
122   TColStd_MapIteratorOfPackedMapOfInteger it(aIntMap->Map());
123   for (Standard_Integer i=1;it.More() && i <= MAXUP; it.Next(), i++) 
124     cout << it.Key() << "  ";
125   cout <<endl;
126 #endif
127 }
128
129