Branch data Line data Source code
1 : : #include "AssocPair.hpp"
2 : :
3 : : #include <cstdlib>
4 : :
5 : : #include "Lasso.hpp"
6 : :
7 : : #ifdef ENABLE_IGEOM
8 : : #include "GeomAssocPairSide.hpp"
9 : : #endif
10 : : #ifdef ENABLE_FBIGEOM
11 : : #include "FBGeomAssocPairSide.hpp"
12 : : #endif
13 : : #ifdef ENABLE_IMESH
14 : : #include "MeshAssocPairSide.hpp"
15 : : #endif
16 : :
17 : : int AssocPair::currId = 0;
18 : :
19 : 8 : AssocPair::AssocPair( iRel_Instance p_instance, iBase_Instance iface0, iRel_RelationType ent_or_set0,
20 : : iRel_IfaceType type0, iRel_RelationStatus p_status0, iBase_Instance iface1,
21 : : iRel_RelationType ent_or_set1, iRel_IfaceType type1, iRel_RelationStatus p_status1 )
22 : 8 : : instance( p_instance )
23 : : {
24 : 8 : pairId = currId++;
25 : :
26 : 8 : iBase_Instance ifaces[] = { iface0, iface1 };
27 : 8 : iRel_IfaceType types[] = { type0, type1 };
28 [ + + ]: 24 : for( int i = 0; i < 2; i++ )
29 : : {
30 [ + + + - ]: 16 : switch( types[i] )
31 : : {
32 : : #ifdef ENABLE_IGEOM
33 : : case iRel_IGEOM_IFACE:
34 [ + - ][ + - ]: 7 : relSides[i] = new GeomAssocPairSide( instance, ifaces[i], pairId );
35 : 7 : break;
36 : : #endif
37 : : #ifdef ENABLE_FBIGEOM
38 : : case iRel_FBIGEOM_IFACE:
39 [ + - ][ + - ]: 1 : relSides[i] = new FBGeomAssocPairSide( instance, ifaces[i], pairId );
40 : 1 : break;
41 : : #endif
42 : : #ifdef ENABLE_IMESH
43 : : case iRel_IMESH_IFACE:
44 [ + - ][ + - ]: 8 : relSides[i] = new MeshAssocPairSide( instance, ifaces[i], pairId );
45 : 8 : break;
46 : : #endif
47 : : default:
48 : 0 : relSides[i] = NULL;
49 : : }
50 : : }
51 : :
52 : 8 : entOrSet[0] = ent_or_set0;
53 : 8 : entOrSet[1] = ent_or_set1;
54 : 8 : relStatus[0] = p_status0;
55 : 8 : relStatus[1] = p_status1;
56 : 8 : }
57 : :
58 : 8 : AssocPair::~AssocPair()
59 : : {
60 [ + + ]: 24 : for( int i = 0; i < 2; i++ )
61 [ + - ]: 16 : delete relSides[i];
62 : 8 : }
63 : :
64 : 6 : int AssocPair::get_all_entities( int iface_no, int dimension, iBase_EntityHandle** entities, int* entities_alloc,
65 : : int* entities_size )
66 : : {
67 : 6 : return relSides[iface_no]->get_all_entities( dimension, entities, entities_alloc, entities_size );
68 : : }
69 : :
70 : 6 : int AssocPair::get_all_sets( int iface_no, iBase_EntitySetHandle** sets, int* sets_alloc, int* sets_size )
71 : : {
72 : 6 : return relSides[iface_no]->get_all_sets( sets, sets_alloc, sets_size );
73 : : }
74 : :
75 : 0 : int AssocPair::get_entities( int iface_no, int dimension, iBase_EntitySetHandle set_handle,
76 : : iBase_EntityHandle** entities, int* entities_alloc, int* entities_size )
77 : : {
78 : 0 : return relSides[iface_no]->get_entities( dimension, set_handle, entities, entities_alloc, entities_size );
79 : : }
80 : :
81 : 9 : int AssocPair::get_ents_dims( int iface_no, iBase_EntityHandle* entities, int entities_size, int** ent_types,
82 : : int* ent_types_alloc, int* ent_types_size )
83 : : {
84 : 9 : return relSides[iface_no]->get_ents_dims( entities, entities_size, ent_types, ent_types_alloc, ent_types_size );
85 : : }
86 : :
87 : 0 : int AssocPair::set_relation( iBase_EntityHandle ent1, iBase_EntityHandle ent2 )
88 : : {
89 [ # # ][ # # ]: 0 : if( entOrSet[0] == iRel_SET || entOrSet[1] == iRel_SET ) ERRORR( iBase_FAILURE, "Invalid relation type" );
[ # # ]
90 : :
91 : : // check that if we're passing in an ent for a 'both'-type
92 : : // assoc, there's already a set associated to the other ent
93 : : iBase_EntityHandle tmp_ent;
94 [ # # ][ # # ]: 0 : if( entOrSet[0] == iRel_BOTH && relSides[1]->get_relation_side( &ent2, 1, &tmp_ent ) != iBase_SUCCESS )
[ # # ][ # # ]
95 [ # # ]: 0 : ERRORR( iBase_FAILURE, "Couldn't find associated set on left side" );
96 [ # # ][ # # ]: 0 : if( entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side( &ent1, 1, &tmp_ent ) != iBase_SUCCESS )
[ # # ][ # # ]
97 [ # # ]: 0 : ERRORR( iBase_FAILURE, "Couldn't find associated set on right side" );
98 : :
99 : : // set ent1 => ent2
100 [ # # ][ # # ]: 0 : if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &ent1, 1, &ent2 ) );
[ # # ]
101 : :
102 : : // set ent1 <= ent2
103 [ # # ][ # # ]: 0 : if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &ent2, 1, &ent1 ) );
[ # # ]
104 : :
105 [ # # ]: 0 : RETURNR( iBase_SUCCESS );
106 : : }
107 : :
108 : 120 : int AssocPair::set_relation( iBase_EntityHandle ent1, iBase_EntitySetHandle set2 )
109 : : {
110 [ + - ][ - + ]: 120 : if( entOrSet[0] == iRel_SET || entOrSet[1] == iRel_ENTITY ) ERRORR( iBase_FAILURE, "Invalid relation type" );
[ # # ]
111 : :
112 : : // check that if we're passing in an ent for a 'both'-type
113 : : // assoc, there's already a set associated to the other ent
114 : : iBase_EntityHandle tmp_ent;
115 [ - + ][ # # ]: 120 : if( entOrSet[0] == iRel_BOTH && relSides[1]->get_relation_side( &set2, 1, &tmp_ent ) != iBase_SUCCESS )
[ # # ][ - + ]
116 [ # # ]: 0 : ERRORR( iBase_FAILURE, "Couldn't find associated set on left side" );
117 : :
118 : : // set ent1 => set2
119 [ + - ][ + - ]: 120 : if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &ent1, 1, &set2 ) );
[ - + ]
120 : :
121 : : // set ent1 <= set2
122 [ + - ][ + - ]: 120 : if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &set2, 1, &ent1 ) );
[ - + ]
123 : :
124 : : // if the right side is a 'both'-type association, set the contents of set2
125 : : // to point to ent1 as well
126 [ + + ][ + - ]: 120 : if( entOrSet[1] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 1, set2, ent1 ) );
[ - + ]
127 : :
128 [ + - ]: 120 : RETURNR( iBase_SUCCESS );
129 : : }
130 : :
131 : 0 : int AssocPair::set_relation( iBase_EntitySetHandle set1, iBase_EntityHandle ent2 )
132 : : {
133 [ # # ][ # # ]: 0 : if( entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_SET ) ERRORR( iBase_FAILURE, "Invalid relation type" );
[ # # ]
134 : :
135 : : // check that if we're passing in an ent for a 'both'-type
136 : : // assoc, there's already a set associated to the other ent
137 : : iBase_EntityHandle tmp_ent;
138 [ # # ][ # # ]: 0 : if( entOrSet[1] == iRel_BOTH && relSides[0]->get_relation_side( &set1, 1, &tmp_ent ) != iBase_SUCCESS )
[ # # ][ # # ]
139 [ # # ]: 0 : ERRORR( iBase_FAILURE, "Couldn't find associated set on right side" );
140 : :
141 : : // set set1 => ent2
142 [ # # ][ # # ]: 0 : if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &set1, 1, &ent2 ) );
[ # # ]
143 : :
144 : : // set ent1 <= set2
145 [ # # ][ # # ]: 0 : if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &ent2, 1, &set1 ) );
[ # # ]
146 : :
147 : : // if the left side is a 'both'-type association, set the contents of set1
148 : : // to point to ent2 as well
149 [ # # ][ # # ]: 0 : if( entOrSet[0] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 0, set1, ent2 ) );
[ # # ]
150 : :
151 [ # # ]: 0 : RETURNR( iBase_SUCCESS );
152 : : }
153 : :
154 : 4 : int AssocPair::set_relation( iBase_EntitySetHandle set1, iBase_EntitySetHandle set2 )
155 : : {
156 [ + - ][ - + ]: 4 : if( entOrSet[0] == iRel_ENTITY || entOrSet[1] == iRel_ENTITY ) ERRORR( iBase_FAILURE, "Invalid relation type" );
157 : :
158 : : // set set1 => set2
159 [ + + ][ - + ]: 4 : if( relStatus[0] == iRel_ACTIVE ) CHK_ERRORR( relSides[0]->set_relation_side( &set1, 1, &set2 ) );
160 : :
161 : : // set set1 <= set2
162 [ + - ][ - + ]: 4 : if( relStatus[1] == iRel_ACTIVE ) CHK_ERRORR( relSides[1]->set_relation_side( &set2, 1, &set1 ) );
163 : :
164 : : // if either side is a 'both'-type association, set the contents of set1
165 : : // to point to set2 as well (and/or vice-versa)
166 [ - + ][ # # ]: 4 : if( entOrSet[0] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 0, set1, set2 ) );
167 [ - + ][ # # ]: 4 : if( entOrSet[1] == iRel_BOTH ) CHK_ERRORR( populate_recursive( 1, set2, set1 ) );
168 : :
169 : 4 : RETURNR( iBase_SUCCESS );
170 : : }
171 : :
172 : 6 : int AssocPair::get_relation( int iface_no, iBase_EntityHandle* entities, int num_entities,
173 : : iBase_EntityHandle* tag_values )
174 : : {
175 [ - + ]: 6 : if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
176 [ - + ]: 6 : if( entOrSet[!iface_no] != iRel_ENTITY ) // other iface is sets
177 : 0 : ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected EntitySet, got Entity" );
178 : :
179 : 6 : return relSides[iface_no]->get_relation_side( entities, num_entities, tag_values );
180 : : }
181 : :
182 : 4 : int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets, iBase_EntityHandle* tag_values )
183 : : {
184 [ - + ]: 4 : if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
185 [ - + ]: 4 : if( entOrSet[!iface_no] != iRel_ENTITY ) // other iface is sets
186 : 0 : ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected EntitySet, got Entity" );
187 : :
188 : 4 : return relSides[iface_no]->get_relation_side( sets, num_sets, tag_values );
189 : : }
190 : :
191 : 12 : int AssocPair::get_relation( int iface_no, iBase_EntityHandle* entities, int num_entities,
192 : : iBase_EntitySetHandle* tag_values )
193 : : {
194 [ - + ]: 12 : if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
195 [ - + ]: 12 : if( entOrSet[!iface_no] == iRel_ENTITY ) // other iface is not sets
196 : 0 : ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected Entity, got EntitySet" );
197 : :
198 : 12 : return relSides[iface_no]->get_relation_side( entities, num_entities, tag_values );
199 : : }
200 : :
201 : 6 : int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets,
202 : : iBase_EntitySetHandle* tag_values )
203 : : {
204 [ + + ]: 6 : if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
205 [ - + ]: 5 : if( entOrSet[!iface_no] == iRel_ENTITY ) // other iface is not sets
206 : 0 : ERRORR( iBase_INVALID_ENTITY_HANDLE, "Expected Entity, got EntitySet" );
207 : :
208 : 5 : return relSides[iface_no]->get_relation_side( sets, num_sets, tag_values );
209 : : }
210 : :
211 : 0 : int AssocPair::get_relation( int iface_no, iBase_EntityHandle* entities, int num_entities,
212 : : iBase_EntityIterator* tag_values )
213 : : {
214 [ # # ][ # # ]: 0 : std::vector< iBase_EntitySetHandle > sets( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &sets[0] ) );
[ # # ][ # # ]
215 : :
216 [ # # ]: 0 : for( int i = 0; i < num_entities; i++ )
217 [ # # ][ # # ]: 0 : CHK_ERRORR( relSides[i]->get_iterator( sets[i], &tag_values[i] ) );
[ # # ]
218 : :
219 [ # # ]: 0 : RETURNR( iBase_SUCCESS );
220 : : }
221 : :
222 : 0 : int AssocPair::get_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets, iBase_EntityIterator* tag_values )
223 : : {
224 [ # # ][ # # ]: 0 : std::vector< iBase_EntitySetHandle > sets2( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &sets2[0] ) );
[ # # ][ # # ]
225 : :
226 [ # # ]: 0 : for( int i = 0; i < num_sets; i++ )
227 [ # # ][ # # ]: 0 : CHK_ERRORR( relSides[iface_no]->get_iterator( sets2[i], &tag_values[i] ) );
[ # # ]
228 : :
229 [ # # ]: 0 : RETURNR( iBase_SUCCESS );
230 : : }
231 : :
232 : 3 : int AssocPair::rmv_relation( int iface_no, iBase_EntityHandle* entities, int num_entities )
233 : : {
234 [ - + ]: 3 : if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
235 : :
236 : : // TODO: handle "both" case
237 : :
238 : : // Remove the opposite side first
239 [ + - ]: 3 : if( relStatus[!iface_no] == iRel_ACTIVE )
240 : : {
241 [ - + ]: 3 : if( entOrSet[!iface_no] == iRel_ENTITY )
242 : : {
243 [ # # ][ # # ]: 0 : std::vector< iBase_EntityHandle > other_entities( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &other_entities[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_entities[0], num_entities ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
244 : : }
245 : : else
246 : : {
247 [ + - ][ + - ]: 3 : std::vector< iBase_EntitySetHandle > other_sets( num_entities );CHK_ERRORR( get_relation( iface_no, entities, num_entities, &other_sets[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_sets[0], num_entities ) );
[ + - ][ - + ]
[ + - ][ + - ]
[ - + ][ + - ]
248 : : }
249 : : }
250 : :
251 : 3 : return relSides[iface_no]->rmv_relation_side( entities, num_entities );
252 : : }
253 : :
254 : 0 : int AssocPair::rmv_relation( int iface_no, iBase_EntitySetHandle* sets, int num_sets )
255 : : {
256 [ # # ]: 0 : if( relStatus[iface_no] == iRel_NOTEXIST ) ERRORR( iBase_FAILURE, "Relation does not exist on this side" );
257 : :
258 : : // TODO: handle "both" case
259 : :
260 : : // Remove the opposite side first
261 [ # # ]: 0 : if( relStatus[!iface_no] == iRel_ACTIVE )
262 : : {
263 [ # # ]: 0 : if( entOrSet[!iface_no] == iRel_ENTITY )
264 : : {
265 [ # # ][ # # ]: 0 : std::vector< iBase_EntityHandle > other_entities( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &other_entities[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_entities[0], num_sets ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
266 : : }
267 : : else
268 : : {
269 [ # # ][ # # ]: 0 : std::vector< iBase_EntitySetHandle > other_sets( num_sets );CHK_ERRORR( get_relation( iface_no, sets, num_sets, &other_sets[0] ) );CHK_ERRORR( relSides[!iface_no]->rmv_relation_side( &other_sets[0], num_sets ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
270 : : }
271 : : }
272 : :
273 : 0 : return relSides[iface_no]->rmv_relation_side( sets, num_sets );
274 : : }
275 : :
276 : 9 : int AssocPair::get_gids( int iface_no, iBase_EntityHandle* entities, int num_entities, int* tag_values )
277 : : {
278 : 9 : return relSides[iface_no]->get_gids( entities, num_entities, tag_values );
279 : : }
280 : :
281 : 9 : int AssocPair::get_gids( int iface_no, iBase_EntitySetHandle* sets, int num_sets, int* tag_values )
282 : : {
283 : 9 : return relSides[iface_no]->get_gids( sets, num_sets, tag_values );
284 : : }
285 : :
286 : 0 : int AssocPair::get_dims( int iface_no, iBase_EntityHandle* entities, int num_entities, int* tag_values )
287 : : {
288 : 0 : return relSides[iface_no]->get_dims( entities, num_entities, tag_values );
289 : : }
290 : :
291 : 9 : int AssocPair::get_dims( int iface_no, iBase_EntitySetHandle* sets, int num_sets, int* tag_values )
292 : : {
293 : 9 : return relSides[iface_no]->get_dims( sets, num_sets, tag_values );
294 : : }
295 : :
296 : 4 : int AssocPair::change_type( int iface_no, iRel_RelationType type )
297 : : {
298 [ + + ][ + - ]: 4 : if( entOrSet[iface_no] == type ) RETURNR( iBase_SUCCESS );
299 [ + - ][ - + ]: 2 : if( entOrSet[iface_no] == iRel_ENTITY || type == iRel_ENTITY )
300 [ # # ]: 0 : ERRORR( iBase_FAILURE, "Can only change type from \"set\" to \"both\", or "
301 : : "vice-versa" );
302 : :
303 : 2 : entOrSet[iface_no] = type;
304 [ - + ][ # # ]: 2 : if( relStatus[iface_no] != iRel_ACTIVE ) RETURNR( iBase_SUCCESS );
305 : :
306 : 2 : iBase_EntitySetHandle* sets = NULL;
307 [ + - ][ - + ]: 2 : int set_alloc = 0, set_size;CHK_ERRORR( relSides[iface_no]->get_related_sets( &sets, &set_alloc, &set_size ) );
308 [ + + ]: 2 : if( type == iRel_BOTH )
309 : : {
310 [ + - ]: 1 : if( entOrSet[!iface_no] == iRel_ENTITY )
311 : : {
312 [ + - ][ + - ]: 1 : std::vector< iBase_EntityHandle > related_ents( set_size );CHK_ERRORR( relSides[iface_no]->get_relation_side( sets, set_size, &related_ents[0] ) );
[ + - ][ - + ]
313 : :
314 [ + + ][ + - ]: 2 : for( int i = 0; i < set_size; i++ )
315 [ + - ][ + - ]: 2 : CHK_ERRORR( populate_recursive( iface_no, sets[i], related_ents[i] ) );
[ - + ]
316 : : }
317 : : else
318 : : {
319 [ # # ][ # # ]: 0 : std::vector< iBase_EntitySetHandle > related_sets( set_size );CHK_ERRORR( relSides[iface_no]->get_relation_side( sets, set_size, &related_sets[0] ) );
[ # # ][ # # ]
320 : :
321 [ # # ][ # # ]: 0 : for( int i = 0; i < set_size; i++ )
322 [ # # ][ # # ]: 1 : CHK_ERRORR( populate_recursive( iface_no, sets[i], related_sets[i] ) );
[ # # ]
323 : : }
324 : : }
325 [ + - ]: 1 : else if( type == iRel_SET )
326 : : {
327 [ + + ]: 2 : for( int i = 0; i < set_size; i++ )
328 [ + - ][ - + ]: 1 : CHK_ERRORR( unpopulate_recursive( iface_no, sets[i] ) );
329 : : }
330 : :
331 : 2 : free( sets );
332 [ + - ]: 4 : RETURNR( iBase_SUCCESS );
333 : : }
334 : :
335 : 4 : int AssocPair::change_status( int iface_no, iRel_RelationStatus status )
336 : : {
337 [ + + ]: 4 : if( relStatus[iface_no] == status ) RETURNR( iBase_SUCCESS );
338 : :
339 : 2 : relStatus[iface_no] = status;
340 : :
341 [ - + ]: 2 : if( status == iRel_NOTEXIST )
342 : : {
343 : : // Destroy the assoc tag
344 [ # # ]: 0 : CHK_ERRORR( relSides[iface_no]->destroy_relation_side() );
345 : : }
346 [ - + ]: 2 : else if( status == iRel_INACTIVE )
347 : : {
348 : : // Create the assoc tag
349 [ # # ]: 0 : CHK_ERRORR( relSides[iface_no]->create_relation_side() );
350 : : }
351 : : // Update the assoc tag
352 [ + - ]: 2 : else if( status == iRel_ACTIVE )
353 : : {
354 [ - + ][ - + ]: 2 : CHK_ERRORR( relSides[iface_no]->destroy_relation_side() );CHK_ERRORR( relSides[iface_no]->create_relation_side() );
355 : :
356 [ - + ]: 2 : if( entOrSet[!iface_no] == iRel_ENTITY )
357 : : {
358 : 0 : iBase_EntityHandle* entities = NULL;
359 : 0 : int ent_alloc = 0, ent_size;
360 : :
361 [ # # ][ # # ]: 0 : CHK_ERRORR( relSides[!iface_no]->get_related_ents( &entities, &ent_alloc, &ent_size ) );
362 [ # # ]: 0 : if( entOrSet[iface_no] == iRel_ENTITY )
363 : : {
364 [ # # ]: 0 : std::vector< iBase_EntityHandle > related_ents( ent_size );
365 [ # # ][ # # ]: 0 : int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_ents[0] );
366 : :
367 [ # # ]: 0 : if( result == iBase_SUCCESS )
368 : : {
369 [ # # ]: 0 : if( iface_no == 0 )
370 [ # # ]: 0 : for( int i = 0; i < ent_size; i++ )
371 [ # # ][ # # ]: 0 : CHK_ERRORR( set_relation( related_ents[i], entities[i] ) );
[ # # ]
372 : : else
373 [ # # ][ # # ]: 0 : for( int i = 0; i < ent_size; i++ )
374 [ # # ][ # # ]: 0 : CHK_ERRORR( set_relation( entities[i], related_ents[i] ) );
[ # # ]
375 : 0 : }
376 : : }
377 : : else
378 : : {
379 [ # # ]: 0 : std::vector< iBase_EntitySetHandle > related_sets( ent_size );
380 [ # # ][ # # ]: 0 : int result = relSides[!iface_no]->get_relation_side( entities, ent_size, &related_sets[0] );
381 : :
382 [ # # ]: 0 : if( result == iBase_SUCCESS )
383 : : {
384 [ # # ]: 0 : if( iface_no == 0 )
385 [ # # ]: 0 : for( int i = 0; i < ent_size; i++ )
386 [ # # ][ # # ]: 0 : CHK_ERRORR( set_relation( related_sets[i], entities[i] ) );
[ # # ]
387 : : else
388 [ # # ][ # # ]: 0 : for( int i = 0; i < ent_size; i++ )
389 [ # # ][ # # ]: 0 : CHK_ERRORR( set_relation( entities[i], related_sets[i] ) );
[ # # ]
390 : 0 : }
391 : : }
392 : :
393 : 0 : free( entities );
394 : : }
395 : : else
396 : : {
397 : 2 : iBase_EntitySetHandle* sets = NULL;
398 : 2 : int set_alloc = 0, set_size;
399 : :
400 [ + - ][ - + ]: 4 : CHK_ERRORR( relSides[!iface_no]->get_related_sets( &sets, &set_alloc, &set_size ) );
401 [ - + ]: 2 : if( entOrSet[iface_no] == iRel_ENTITY )
402 : : {
403 [ # # ]: 0 : std::vector< iBase_EntityHandle > related_ents( set_size );
404 [ # # ][ # # ]: 0 : int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_ents[0] );
405 : :
406 [ # # ]: 0 : if( result == iBase_SUCCESS )
407 : : {
408 [ # # ]: 0 : if( iface_no == 0 )
409 [ # # ]: 0 : for( int i = 0; i < set_size; i++ )
410 [ # # ][ # # ]: 0 : CHK_ERRORR( set_relation( related_ents[i], sets[i] ) );
[ # # ]
411 : : else
412 [ # # ][ # # ]: 0 : for( int i = 0; i < set_size; i++ )
413 [ # # ][ # # ]: 0 : CHK_ERRORR( set_relation( sets[i], related_ents[i] ) );
[ # # ]
414 : 0 : }
415 : : }
416 : : else
417 : : {
418 [ + - ]: 2 : std::vector< iBase_EntitySetHandle > related_sets( set_size );
419 [ + - ][ + - ]: 2 : int result = relSides[!iface_no]->get_relation_side( sets, set_size, &related_sets[0] );
420 : :
421 [ + - ]: 2 : if( result == iBase_SUCCESS )
422 : : {
423 [ + - ]: 2 : if( iface_no == 0 )
424 [ + + ]: 4 : for( int i = 0; i < set_size; i++ )
425 [ + - ][ + - ]: 2 : CHK_ERRORR( set_relation( related_sets[i], sets[i] ) );
[ - + ]
426 : : else
427 [ # # ][ + - ]: 2 : for( int i = 0; i < set_size; i++ )
428 [ # # ][ # # ]: 0 : CHK_ERRORR( set_relation( sets[i], related_sets[i] ) );
[ # # ]
429 : 2 : }
430 : : }
431 : :
432 : 2 : free( sets );
433 : : }
434 : : }
435 : : else
436 : : {
437 : 0 : ERRORR( iBase_INVALID_ARGUMENT, "Invalid argument for relation status" );
438 : : }
439 : :
440 : 4 : RETURNR( iBase_SUCCESS );
441 : : }
442 : :
443 : 0 : bool AssocPair::equivalent( iBase_Instance iface0, iBase_Instance iface1, bool* order_switched )
444 : : {
445 [ # # ][ # # ]: 0 : if( iface0 == relSides[0]->instance() && iface1 == relSides[1]->instance() )
[ # # ]
446 : : {
447 [ # # ]: 0 : if( order_switched ) *order_switched = false;
448 : 0 : return true;
449 : : }
450 [ # # ][ # # ]: 0 : else if( iface0 == relSides[1]->instance() && iface1 == relSides[0]->instance() )
[ # # ]
451 : : {
452 [ # # ]: 0 : if( order_switched ) *order_switched = true;
453 : 0 : return true;
454 : : }
455 : : else
456 : 0 : return false;
457 : : }
458 : :
459 : 0 : bool AssocPair::equivalent( iRel_IfaceType type0, iRel_IfaceType type1, bool* order_switched )
460 : : {
461 [ # # ][ # # ]: 0 : if( type0 == relSides[0]->type() && type1 == relSides[1]->type() )
[ # # ]
462 : : {
463 [ # # ]: 0 : if( order_switched ) *order_switched = false;
464 : 0 : return true;
465 : : }
466 [ # # ][ # # ]: 0 : else if( type0 == relSides[1]->type() && type1 == relSides[0]->type() )
[ # # ]
467 : : {
468 [ # # ]: 0 : if( order_switched ) *order_switched = true;
469 : 0 : return true;
470 : : }
471 : : else
472 : 0 : return false;
473 : : }
474 : :
475 : 6 : bool AssocPair::contains( iBase_Instance iface )
476 : : {
477 [ + + ][ + - ]: 6 : return ( iface == relSides[0]->instance() || iface == relSides[1]->instance() );
478 : : }
479 : :
480 : 3 : int AssocPair::populate_recursive( int iface_no, iBase_EntitySetHandle set, iBase_EntityHandle related_ent )
481 : : {
482 : 3 : iBase_EntityHandle* entities = NULL;
483 : 3 : int entities_alloc = 0, entities_size;
484 : :
485 [ + - ][ - + ]: 3 : CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );
486 : :
487 [ + + ]: 15 : for( int i = 0; i < entities_size; i++ )
488 [ + - ][ - + ]: 12 : CHK_ERRORR( relSides[iface_no]->set_relation_side( entities + i, 1, &related_ent ) );
489 : :
490 : 3 : free( entities );
491 [ + - ]: 3 : RETURNR( iBase_SUCCESS );
492 : : }
493 : :
494 : 0 : int AssocPair::populate_recursive( int iface_no, iBase_EntitySetHandle set, iBase_EntitySetHandle related_set )
495 : : {
496 : 0 : iBase_EntityHandle* entities = NULL;
497 : : int entities_alloc, entities_size;
498 : :
499 [ # # ][ # # ]: 0 : CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );
500 : :
501 [ # # ]: 0 : for( int i = 0; i < entities_size; i++ )
502 [ # # ][ # # ]: 0 : CHK_ERRORR( relSides[iface_no]->set_relation_side( entities + i, 1, &related_set ) );
503 : :
504 : 0 : free( entities );
505 [ # # ]: 0 : RETURNR( iBase_SUCCESS );
506 : : }
507 : :
508 : 1 : int AssocPair::unpopulate_recursive( int iface_no, iBase_EntitySetHandle set )
509 : : {
510 : 1 : iBase_EntityHandle* entities = NULL;
511 : 1 : int entities_alloc = 0, entities_size;
512 : :
513 [ + - ][ - + ]: 1 : CHK_ERRORR( relSides[iface_no]->get_entities( -1, set, &entities, &entities_alloc, &entities_size ) );CHK_ERRORR( relSides[iface_no]->rmv_relation_side( entities, entities_size ) );
[ + - ][ - + ]
514 : :
515 : 1 : free( entities );
516 [ + - ]: 1 : RETURNR( iBase_SUCCESS );
517 : : }
|