0031313: Foundation Classes - Dump improvement for classes
[occt.git] / src / TDF / TDF_Delta.cxx
1 // Created by: DAUTRY Philippe
2 // Copyright (c) 1997-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 //              -------------
17 // Version:     0.0
18 //Version       Date            Purpose
19 //              0.0     Sep  8 1997     Creation
20
21 #include <Standard_OutOfRange.hxx>
22 #include <Standard_Dump.hxx>
23 #include <Standard_Type.hxx>
24 #include <TCollection_ExtendedString.hxx>
25 #include <TDF_AttributeDelta.hxx>
26 #include <TDF_Data.hxx>
27 #include <TDF_Delta.hxx>
28 #include <TDF_LabelMap.hxx>
29 #include <TDF_ListIteratorOfAttributeDeltaList.hxx>
30 #include <TDF_ListIteratorOfLabelList.hxx>
31 #include <TDF_MapIteratorOfLabelMap.hxx>
32
33 IMPLEMENT_STANDARD_RTTIEXT(TDF_Delta,Standard_Transient)
34
35 #ifdef OCCT_DEBUG
36 #include <Standard_ConstructionError.hxx>
37 #endif
38
39 #undef DEB_DELTA
40
41 //=======================================================================
42 //function : TDF_Delta
43 //purpose  : 
44 //=======================================================================
45
46 TDF_Delta::TDF_Delta() 
47 : myBeginTime(0),
48   myEndTime(0)
49 {}
50
51
52 //=======================================================================
53 //function : Validity
54 //purpose  : 
55 //=======================================================================
56
57 void TDF_Delta::Validity
58 (const Standard_Integer aBeginTime,
59  const Standard_Integer anEndTime)
60 {
61   myBeginTime   = aBeginTime;
62   myEndTime     = anEndTime;
63 }
64
65
66 //=======================================================================
67 //function : AddAttributeDelta
68 //purpose  : 
69 //=======================================================================
70
71 void TDF_Delta::AddAttributeDelta
72 (const Handle(TDF_AttributeDelta)& anAttributeDelta)
73 { if (!anAttributeDelta.IsNull()) myAttDeltaList.Append(anAttributeDelta); }
74
75
76 //=======================================================================
77 //function : BeforeOrAfterApply
78 //purpose  : 
79 //=======================================================================
80
81 void TDF_Delta::BeforeOrAfterApply(const Standard_Boolean before) const
82 {
83   TDF_AttributeDeltaList ADlist;
84 //  for (TDF_ListIteratorOfAttributeDeltaList itr(myAttDeltaList);
85   TDF_ListIteratorOfAttributeDeltaList itr(myAttDeltaList) ;
86   for ( ; itr.More(); itr.Next()) ADlist.Append(itr.Value());
87
88   Handle(TDF_AttributeDelta) attDelta;
89   Handle(TDF_Attribute) att;
90
91   Standard_Boolean noDeadLock = Standard_True;
92   Standard_Integer nbAD = ADlist.Extent();
93   Standard_Boolean next;
94   while (noDeadLock && (nbAD != 0)) {
95     itr.Initialize(ADlist);
96     while (itr.More()) {
97       next = Standard_True;
98       attDelta = itr.Value();
99       att = attDelta->Attribute();
100       if (before)
101         next = !att->BeforeUndo(attDelta);
102       else
103         next = !att->AfterUndo(attDelta);
104
105       if (next)
106         itr.Next();
107       else
108         ADlist.Remove(itr);
109     }
110     noDeadLock = (nbAD > ADlist.Extent());
111     nbAD = ADlist.Extent();
112   }
113
114   if (!noDeadLock) {
115 #ifdef OCCT_DEBUG
116     if (before) std::cout<<"Before"; else std::cout<<"After";
117     std::cout<<"Undo(): dead lock between these attributes:"<<std::endl;
118     for (itr.Initialize(ADlist); itr.More(); itr.Next()) {
119       std::cout<<"AttributeDelta type = "<<itr.Value()->DynamicType()->Name();
120       std::cout<<"  Attribute type = "<<itr.Value()->Attribute()->DynamicType()->Name()<<std::endl;
121     if (before)
122       std::cout<<"BeforeUndo(): dead lock."<<std::endl;
123     else
124       std::cout<<"AfterUndo(): dead lock."<<std::endl;
125     }
126 #endif
127     for (itr.Initialize(ADlist); itr.More(); itr.Next()) {
128       attDelta = itr.Value();
129       att = attDelta->Attribute();
130       if (before)
131         att->BeforeUndo(attDelta,Standard_True);
132       else
133         att->AfterUndo(attDelta,Standard_True);
134     }
135   }
136 }
137
138
139 //=======================================================================
140 //function : Apply
141 //purpose  : 
142 //=======================================================================
143
144 void TDF_Delta::Apply()
145 {
146   TDF_ListIteratorOfAttributeDeltaList itr;
147   for (itr.Initialize(myAttDeltaList); itr.More(); itr.Next()) {
148     const Handle(TDF_AttributeDelta)& attDelta = itr.Value();
149     attDelta->Apply();
150   }
151 }
152
153
154 //=======================================================================
155 //function : Labels
156 //purpose  : 
157 //=======================================================================
158
159 void TDF_Delta::Labels(TDF_LabelList& aLabelList) const
160 {
161   TDF_LabelMap labMap;
162   // If <aLabelList> is not empty...
163 #ifdef OCCT_DEBUG_DELTA
164   Standard_Boolean inList;
165   if (aLabelList.Extent() > 0) std::cout<<"Previously added as modified label(s) ";
166 #endif
167   for (TDF_ListIteratorOfLabelList it1(aLabelList);
168        it1.More(); it1.Next()) {
169 #ifdef OCCT_DEBUG_DELTA
170     const TDF_Label& lab1 = it1.Value();
171     inList = labMap.Add(lab1);
172     if (!inList) {
173       lab1.EntryDump(std::cout);std::cout<<" | ";
174     }
175 #endif
176   }
177 #ifdef OCCT_DEBUG_DELTA
178   std::cout<<std::endl;
179 #endif
180
181   // New labels to add.
182 #ifdef OCCT_DEBUG_DELTA
183   if (myAttDeltaList.Extent() > 0) std::cout<<"New added as modified label(s) ";
184 #endif
185   for (TDF_ListIteratorOfAttributeDeltaList it2(myAttDeltaList);
186        it2.More();
187        it2.Next()) {
188 #ifdef OCCT_DEBUG_DELTA
189     const TDF_Label& lab1 = it2.Value()->Label();
190     inList = labMap.Add(lab1);
191     if (!inList) {
192       lab1.EntryDump(std::cout);std::cout<<" | ";
193     }
194 #endif
195   }
196 #ifdef OCCT_DEBUG_DELTA
197   std::cout<<std::endl;
198 #endif
199
200   // Now put labels into <aLabelList>.
201   aLabelList.Clear();
202   for (TDF_MapIteratorOfLabelMap it3(labMap);
203        it3.More(); it3.Next()) {
204     aLabelList.Append(it3.Key());
205   }
206 }
207
208 //=======================================================================
209 //function : Dump
210 //purpose  : 
211 //=======================================================================
212
213 void TDF_Delta::Dump(Standard_OStream& OS) const
214 {
215   OS<<"DELTA available from time \t#"<<myBeginTime<<" to time \t#"<<myEndTime<<std::endl;
216   Standard_Integer n = 0;
217 //  for (TDF_ListIteratorOfAttributeDeltaList itr(myAttDeltaList);
218   TDF_ListIteratorOfAttributeDeltaList itr(myAttDeltaList) ;
219   for ( ; itr.More(); itr.Next()) ++n;
220   OS<<"Nb Attribute Delta(s): "<<n<<std::endl;
221   for (itr.Initialize(myAttDeltaList); itr.More(); itr.Next()) {
222     const Handle(TDF_AttributeDelta)& attDelta = itr.Value();
223     OS<<"| "; attDelta->Dump(OS); OS<<std::endl;
224   }
225 }
226
227 //=======================================================================
228 //function : DumpJson
229 //purpose  : 
230 //=======================================================================
231 void TDF_Delta::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
232 {
233   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
234
235   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myBeginTime)
236   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myEndTime)
237
238   for (TDF_AttributeDeltaList::Iterator anAttDeltaListIt (myAttDeltaList); anAttDeltaListIt.More(); anAttDeltaListIt.Next())
239   {
240     const Handle(TDF_AttributeDelta)& anAttDeltaList = anAttDeltaListIt.Value();
241     OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, anAttDeltaList.get())
242   }
243
244   OCCT_DUMP_FIELD_VALUE_STRING (theOStream, myName)
245 }