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