Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : BridgeManager.cpp
3 : : //
4 : : // Purpose : Manages the TopologyBridges being used by
5 : : // a single TopologyEntity. Encapsulates the
6 : : // merging/unmerging of TopologyBridges into/from
7 : : // a TopologyEntity.
8 : : //
9 : : // Creator : Darryl Melander
10 : : //
11 : : // Creation Date : 02/20/99
12 : : //
13 : : // Owner : Darryl Melander
14 : : //-------------------------------------------------------------------------
15 : : #include "BridgeManager.hpp"
16 : : #include "TopologyBridge.hpp"
17 : : #include "TopologyEntity.hpp"
18 : :
19 : : #include <algorithm>
20 : :
21 : : // Constructor.
22 : : // Attaches this BridgeManager to 'owner'.
23 : 295153 : BridgeManager::BridgeManager()
24 [ + - ]: 295153 : : topologyEntity(NULL)
25 : : {
26 : 295153 : }
27 : :
28 : : // Destructor
29 [ + - ]: 364720 : BridgeManager::~BridgeManager()
30 : : {
31 [ + - ]: 182360 : std::vector<TopologyBridge*>::iterator iter;
32 [ + - ][ # # ]: 182360 : for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
[ + - ][ + - ]
[ - + ]
33 : : {
34 [ # # ][ # # ]: 0 : delete (*iter);
[ # # ]
35 : : }
36 [ + - ]: 182360 : mergeList.clear();
37 [ - + ]: 182360 : }
38 : :
39 : 295153 : void BridgeManager::set_entity(TopologyEntity* ent)
40 : : {
41 : 295153 : topologyEntity = ent;
42 : 295153 : }
43 : :
44 : : // Adds this TB to the child list. Tells 'bridge'
45 : : // that it belongs to this BridgeManager. If bridge is
46 : : // already in this BridgeManager, we return FAILURE.
47 : : // This doesn't mean 'bridge' won't be in this manager,
48 : : // it just means it won't be in the list twice.
49 : 170159 : CubitStatus BridgeManager::add_bridge(TopologyBridge* bridge)
50 : : {
51 [ + - ][ - + ]: 170159 : if( !bridge || bridge->owner() )
[ - + ]
52 : : {
53 [ # # ][ # # ]: 0 : assert( bridge && !bridge->owner() );
54 : 0 : return CUBIT_FAILURE;
55 : : }
56 : :
57 : 170159 : mergeList.push_back(bridge);
58 : :
59 : 170159 : bridge->owner(this);
60 : 170159 : return CUBIT_SUCCESS;
61 : : }
62 : :
63 : : // This function sets the
64 : 0 : CubitStatus BridgeManager::add_bridge_as_representation(TopologyBridge* bridge)
65 : : {
66 : : // Make sure bridge isn't already owned by someone else
67 [ # # ][ # # ]: 0 : if( !bridge || bridge->owner() )
[ # # ]
68 : : {
69 [ # # ][ # # ]: 0 : assert( bridge && !bridge->owner() );
70 : 0 : return CUBIT_FAILURE;
71 : : }
72 : :
73 : : // Add the bridge to the beginning of the list
74 : 0 : mergeList.insert(mergeList.begin(), bridge );
75 : :
76 : 0 : bridge->owner(this);
77 : 0 : return CUBIT_SUCCESS;
78 : : }
79 : :
80 : : // Removes 'bridge' from this. If it wasn't in this,
81 : : // then return FAILURE.
82 : 103056 : CubitStatus BridgeManager::remove_bridge(TopologyBridge* bridge )
83 : : {
84 [ + - ]: 103056 : std::vector<TopologyBridge*>::iterator iter;
85 [ + - ][ + - ]: 103056 : iter = std::find(mergeList.begin(), mergeList.end(), bridge);
[ + - ]
86 [ + - ][ + - ]: 103056 : if (iter != mergeList.end())
[ + - ]
87 [ + - ]: 103056 : mergeList.erase(iter);
88 : : else
89 : 0 : return CUBIT_FAILURE;
90 : :
91 [ + - ]: 103056 : bridge->owner(0);
92 : 103056 : return CUBIT_SUCCESS;
93 : : }
94 : :
95 : 103001 : CubitStatus BridgeManager::bridge_destroyed( TopologyBridge* bridge )
96 : : {
97 : : // if( firstBridge == bridge &&
98 : : // bridge->next_bridge() &&
99 : : // bridge->next_bridge()->bridge_sense() != bridge->bridge_sense() )
100 : : // topologyEntity->reverse_topology();
101 : :
102 : 103001 : return remove_bridge( bridge );
103 : : }
104 : :
105 : 98684 : CubitStatus BridgeManager::remove_all_bridges()
106 : : {
107 [ + - ][ + - ]: 98684 : if (mergeList.empty())
108 : 98684 : return CUBIT_SUCCESS;
109 : :
110 [ # # ]: 0 : std::vector<TopologyBridge*>::iterator iter;
111 [ # # ]: 0 : std::vector<TopologyBridge*> temp_list;
112 : :
113 : : // make a copy of the list so we can modify the real one
114 [ # # ]: 0 : temp_list = mergeList;
115 : :
116 [ # # ][ # # ]: 0 : for (iter=temp_list.begin(); iter!=temp_list.end(); iter++)
[ # # ][ # # ]
[ # # ]
117 : : {
118 [ # # ][ # # ]: 0 : if (!remove_bridge( *iter ))
[ # # ]
119 : 0 : break;
120 : : }
121 : :
122 [ # # ][ # # ]: 98684 : return mergeList.empty() ? CUBIT_SUCCESS : CUBIT_FAILURE;
[ # # ]
123 : : }
124 : :
125 : : // Transfer all bridges from 'dead' to 'this'.
126 : : // Set correct pointers.
127 : 2604 : CubitStatus BridgeManager::merge(BridgeManager* dead_manager,
128 : : CubitSense relative_sense )
129 : : {
130 [ + - ][ + + ]: 2604 : if (dead_manager->mergeList.empty())
131 : 1188 : return CUBIT_SUCCESS;
132 : :
133 : : // Remove bridge list from dead BridgeManager
134 [ + - ]: 1416 : std::vector<TopologyBridge*> dead_list = dead_manager->mergeList;
135 [ + - ]: 1416 : dead_manager->mergeList.clear();
136 : :
137 : : // Set owner and reverse sense if necessary
138 : : // for all bridges in merge list.
139 [ + - ]: 1416 : std::vector<TopologyBridge*>::iterator iter;
140 [ + - ][ + - ]: 2832 : for (iter = dead_list.begin(); iter != dead_list.end(); iter++)
[ + - ][ + - ]
[ + + ]
141 : : {
142 [ + - ][ + - ]: 1416 : (*iter)->owner(this);
143 [ + + ]: 1416 : if( relative_sense == CUBIT_REVERSED )
144 [ + - ][ + - ]: 96 : (*iter)->reverse_bridge_sense();
145 : : }
146 : :
147 : : // append merge list to end of this manager's bridge list
148 [ + - ][ + - ]: 1416 : mergeList.insert(mergeList.end(), dead_list.begin(), dead_list.end());
[ + - ][ + - ]
149 : :
150 [ + - ]: 2604 : return CUBIT_SUCCESS;
151 : : }
152 : :
153 : : // Indicates whether this bridge is in this manager.
154 : 0 : CubitBoolean BridgeManager::contains_bridge(TopologyBridge* bridge) const
155 : : {
156 : 0 : return bridge->owner() == (TBOwner*)this;
157 : : }
158 : :
159 : : // Appends all children TBs to bridge_list.
160 : : // There is no check for duplicates in the list.
161 : : // The number of TBs added is returned.
162 : 256493 : int BridgeManager::get_bridge_list(
163 : : DLIList<TopologyBridge*>& bridge_list) const
164 : : {
165 [ + - ]: 256493 : std::vector<TopologyBridge*>::const_iterator iter;
166 [ + - ][ + - ]: 541150 : for (iter = mergeList.begin(); iter != mergeList.end(); iter++)
[ + - ][ + - ]
[ + + ]
167 : : {
168 [ + - ][ + - ]: 284657 : bridge_list.append(*iter);
169 : : }
170 [ + - ]: 256493 : return mergeList.size();
171 : : }
172 : :
173 : :
174 : : // Get all the child TB's that are owned by the passed
175 : : // BridgeManager.
176 : 0 : int BridgeManager::get_bridge_list(
177 : : DLIList<TopologyBridge*>& bridge_list,
178 : : GeometryQueryEngine* gqe_ptr ) const
179 : : {
180 [ # # ]: 0 : std::vector<TopologyBridge*>::const_iterator iter;
181 [ # # ][ # # ]: 0 : for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
[ # # ][ # # ]
[ # # ]
182 : : {
183 [ # # ][ # # ]: 0 : if ( (*iter)->get_geometry_query_engine() == gqe_ptr )
[ # # ]
184 [ # # ][ # # ]: 0 : bridge_list.append(*iter);
185 : : }
186 [ # # ]: 0 : return bridge_list.size();
187 : : // TODO - BWH - return on this function should be consistent with other bridge list function
188 : : }
189 : :
190 : 504 : TopologyBridge* BridgeManager::topology_bridge(
191 : : GeometryQueryEngine* gqe_ptr ) const
192 : : {
193 [ + - ]: 504 : std::vector<TopologyBridge*>::const_iterator iter;
194 [ + - ][ # # ]: 504 : for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
[ + - ][ + - ]
[ + - ]
195 : : {
196 [ + - ][ + - ]: 504 : if ( (*iter)->get_geometry_query_engine() == gqe_ptr )
[ + - ]
197 [ + - ]: 504 : return *iter;
198 : : }
199 : :
200 : 504 : return 0;
201 : : }
202 : :
203 : :
204 : 0 : void BridgeManager::reverse_bridge_senses ()
205 : : {
206 [ # # ]: 0 : std::vector<TopologyBridge*>::iterator iter;
207 [ # # ][ # # ]: 0 : for (iter=mergeList.begin(); iter!=mergeList.end(); iter++)
[ # # ][ # # ]
[ # # ]
208 : : {
209 [ # # ][ # # ]: 0 : (*iter)->reverse_bridge_sense();
210 : : }
211 : 0 : }
212 : :
213 : 0 : CubitStatus BridgeManager::swap_bridge( TopologyBridge* old_tb,
214 : : TopologyBridge* new_tb,
215 : : bool reversed )
216 : : {
217 : : // make sure new_tb isn't already owned by someone else
218 [ # # ][ # # ]: 0 : if( new_tb->owner() != NULL )
219 : : {
220 [ # # ][ # # ]: 0 : assert( new_tb->owner() == 0 );
221 : 0 : return CUBIT_FAILURE;
222 : : }
223 : :
224 : : // Replace old bridge with new bridge at same location
225 : : // in linked list.
226 : :
227 [ # # ]: 0 : std::vector<TopologyBridge*>::iterator iter;
228 [ # # ][ # # ]: 0 : iter = std::find(mergeList.begin(), mergeList.end(), old_tb);
[ # # ]
229 [ # # ][ # # ]: 0 : if (iter != mergeList.end())
[ # # ]
230 : : {
231 [ # # ]: 0 : iter = mergeList.erase(iter);
232 [ # # ]: 0 : mergeList.insert(iter, new_tb);
233 : : }
234 : : else
235 : : {
236 : 0 : assert(false);
237 : : return CUBIT_FAILURE;
238 : : }
239 : :
240 : : // Update owner pointers
241 : :
242 [ # # ]: 0 : new_tb->owner(this);
243 [ # # ]: 0 : old_tb->owner(0);
244 : :
245 : : // If 'reversed == true' then make sure bridges have
246 : : // opposite sense.
247 : :
248 [ # # ][ # # ]: 0 : bool same_sense = new_tb->bridge_sense() == old_tb->bridge_sense();
249 [ # # ]: 0 : if (reversed == same_sense) // if (reversed XOR same_sense)
250 [ # # ]: 0 : new_tb->reverse_bridge_sense();
251 : :
252 : 0 : return CUBIT_SUCCESS;
253 : : }
254 : :
255 : 287793 : int BridgeManager::number_of_bridges() const
256 : : {
257 : 287793 : return mergeList.size();
258 : : }
259 : :
260 : 0 : void BridgeManager::notify_reversed( TopologyBridge* bridge )
261 : : {
262 : 0 : bridge->reverse_bridge_sense();
263 : 0 : }
|