0024927: Getting rid of "Persistent" functionality -- Code
[occt.git] / src / MgtTopLoc / MgtTopLoc.cxx
1 // Created on: 1993-03-03
2 // Created by: Remi LEQUETTE
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 // Update:      Frederic Maupas
18
19 #include <MgtTopLoc.ixx>
20
21 // Used for testing DownCast time
22 #define MgtTopLocSpeedDownCast
23
24 #ifdef chrono
25 #include<OSD_Timer.hxx>
26 extern OSD_Timer LocTimer;
27 #endif
28
29 //=======================================================================
30 //function : Translate
31 //purpose  : ... from Transient to Persistent
32 //=======================================================================
33
34 Handle(PTopLoc_Datum3D)  
35      MgtTopLoc::Translate(const Handle(TopLoc_Datum3D)& D,
36                           PTColStd_TransientPersistentMap& aMap)
37 {
38
39   Handle(PTopLoc_Datum3D) PD;
40   if (aMap.IsBound(D)) {
41 #ifdef MgtTopLocSpeedDownCast
42     Handle(Standard_Persistent) aPers = aMap.Find(D);
43     PD = (Handle(PTopLoc_Datum3D)&) aPers;
44 #else
45     PD = Handle(PTopLoc_Datum3D)::DownCast(aMap.Find(D));
46 #endif
47   }
48   else {
49     PD = new PTopLoc_Datum3D(D->Transformation());
50     aMap.Bind(D,PD);
51   }
52
53   return PD;
54 }
55
56
57 //=======================================================================
58 //function : Translate
59 //purpose  : ... from Persistent to Transient
60 //=======================================================================
61
62 Handle(TopLoc_Datum3D)  
63      MgtTopLoc::Translate(const Handle(PTopLoc_Datum3D)& D,
64                           PTColStd_PersistentTransientMap& aMap)
65 {
66   Handle(TopLoc_Datum3D) TD;
67   if (aMap.IsBound(D)) {
68 #ifdef MgtTopLocSpeedDownCast
69     Handle(Standard_Transient) aTrans = aMap.Find(D);
70     TD = (Handle(TopLoc_Datum3D)&) aTrans;
71 #else
72     TD = Handle(TopLoc_Datum3D)::DownCast(aMap.Find(D));
73 #endif
74   }
75   else {
76     TD = new TopLoc_Datum3D(D->Transformation());
77     aMap.Bind(D, TD);
78   }
79
80   return TD;
81 }
82
83 //=======================================================================
84 //function : Translate
85 //purpose  : .. from Transient to Persistent
86 //=======================================================================
87
88 PTopLoc_Location  
89 MgtTopLoc::Translate(const TopLoc_Location& L,
90                      PTColStd_TransientPersistentMap& aMap)
91 {
92   PTopLoc_Location result;
93   if (!L.IsIdentity()) {
94     result = PTopLoc_Location(Translate(L.FirstDatum(), aMap),
95                               L.FirstPower(),
96                               Translate(L.NextLocation(), aMap));
97   }
98
99   return result;
100 }
101
102
103 //=======================================================================
104 //function : Translate
105 //purpose  : .. from Persistent to Transient
106 //=======================================================================
107
108 TopLoc_Location 
109 MgtTopLoc::Translate(const PTopLoc_Location& L,
110                      PTColStd_PersistentTransientMap& aMap)
111 {
112 #ifdef chrono
113   LocTimer.Start();
114 #endif
115
116   TopLoc_Location result;
117   if (!L.IsIdentity()) {
118     result = Translate(L.Next(),aMap) * 
119       TopLoc_Location(Translate(L.Datum3D(),aMap)).Powered(L.Power());
120   }
121 #ifdef chrono
122   LocTimer.Stop();
123 #endif
124
125   return result;
126 }
127
128