Branch data Line data Source code
1 : : /**
2 : : * Copyright 2006 Sandia Corporation. Under the terms of Contract
3 : : * DE-AC04-94AL85000 with Sandia Coroporation, the U.S. Government
4 : : * retains certain rights in this software.
5 : : *
6 : : * This library is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU Lesser General Public
8 : : * License as published by the Free Software Foundation; either
9 : : * version 2.1 of the License, or (at your option) any later version.
10 : : *
11 : : */
12 : : #include "iRel_Lasso.hpp"
13 : :
14 : : #include "Lasso.hpp"
15 : : #include "AssocPair.hpp"
16 : : #include "ArrayManager.hpp"
17 : :
18 : : #include <algorithm>
19 : : #include <cmath>
20 : : #include <cstdio>
21 : : #include <iostream>
22 : : #include <map>
23 : : #include <vector>
24 : :
25 : : const bool debug = false;
26 : :
27 : 0 : void iRel_getErrorType(iRel_Instance instance, int *error_type)
28 : : {
29 [ # # ]: 0 : if (instance == NULL)
30 : 0 : *error_type = iBase_FAILURE;
31 : : else
32 : 0 : *error_type = LASSOI->lastErrorType;
33 : 0 : }
34 : :
35 : 0 : void iRel_getDescription(iRel_Instance instance, char *descr, int descr_len)
36 : : {
37 [ # # ]: 0 : if (instance == NULL) {
38 : 0 : strcpy(descr, "iRel_getDescription: Invalid instance");
39 : : }
40 : : else {
41 : 0 : unsigned int len = std::min(strlen(LASSOI->lastErrorDescription),
42 : 0 : static_cast<size_t>(descr_len));
43 : 0 : strncpy(descr, LASSOI->lastErrorDescription, len);
44 : 0 : descr[len] = '\0';
45 : : }
46 : 0 : }
47 : :
48 : 4 : void iRel_create(/* in */ const char * /* options */,
49 : : iRel_Instance *instance,
50 : : int *err,
51 : : const int options_len)
52 : : {
53 [ - + ]: 4 : if (0 != options_len) {
54 : 0 : *instance = NULL;
55 : 0 : *err = iBase_NOT_SUPPORTED;
56 : : }
57 : :
58 [ + - ]: 4 : *instance = new Lasso();
59 : 4 : *err = iBase_SUCCESS;
60 : 4 : }
61 : :
62 : 4 : void iRel_destroy(iRel_Instance instance, int *err)
63 : : {
64 [ + - ]: 4 : delete LASSOI;
65 : 4 : *err = iBase_SUCCESS;
66 : 4 : }
67 : :
68 : 7 : void iRel_createPair (
69 : : iRel_Instance instance,
70 : : iBase_Instance iface1,
71 : : const int ent_or_set1,
72 : : const int iface_type1,
73 : : const int irel_status1,
74 : : iBase_Instance iface2,
75 : : const int ent_or_set2,
76 : : const int iface_type2,
77 : : const int irel_status2,
78 : : iRel_PairHandle *pair,
79 : : int *err)
80 : : {
81 : : AssocPair *assoc_pair = new AssocPair(
82 : : instance,
83 : : iface1, static_cast<iRel_RelationType>(ent_or_set1),
84 : : static_cast<iRel_IfaceType>(iface_type1),
85 : : static_cast<iRel_RelationStatus>(irel_status1),
86 : : iface2, static_cast<iRel_RelationType>(ent_or_set2),
87 : : static_cast<iRel_IfaceType>(iface_type2),
88 : : static_cast<iRel_RelationStatus>(irel_status2)
89 [ + - ]: 7 : );
90 : 7 : LASSOI->insert_pair(assoc_pair);
91 : :
92 : 7 : *pair = reinterpret_cast<iRel_PairHandle>(assoc_pair);
93 : 7 : RETURN(iBase_SUCCESS);
94 : : }
95 : :
96 : 2 : void iRel_getPairInfo (
97 : : iRel_Instance instance,
98 : : iRel_PairHandle pair,
99 : : iBase_Instance *iface1,
100 : : int *ent_or_set1,
101 : : int *iface_type1,
102 : : int *irel_status1,
103 : : iBase_Instance *iface2,
104 : : int *ent_or_set2,
105 : : int *iface_type2,
106 : : int *irel_status2,
107 : : int *err)
108 : : {
109 [ - + ]: 2 : CHK_PAIR();
110 : :
111 : 2 : *iface1 = ASSOCPAIRI->iface_instance(0);
112 : 2 : *ent_or_set1 = ASSOCPAIRI->relation_type(0);
113 : 2 : *iface_type1 = ASSOCPAIRI->iface_type(0);
114 : 2 : *irel_status1 = ASSOCPAIRI->relation_status(0);
115 : 2 : *iface2 = ASSOCPAIRI->iface_instance(1);
116 : 2 : *iface_type2 = ASSOCPAIRI->iface_type(1);
117 : 2 : *ent_or_set2 = ASSOCPAIRI->relation_type(1);
118 : 2 : *irel_status2 = ASSOCPAIRI->relation_status(1);
119 : :
120 : 2 : RETURN(iBase_SUCCESS);
121 : : }
122 : :
123 : 2 : void iRel_changePairType (
124 : : iRel_Instance instance,
125 : : iRel_PairHandle pair,
126 : : int ent_or_set1,
127 : : int ent_or_set2,
128 : : int *err)
129 : : {
130 [ - + ]: 2 : CHK_PAIR();
131 : :
132 [ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->change_type(0, static_cast<iRel_RelationType>(
133 : : ent_or_set1)) );
134 [ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->change_type(1, static_cast<iRel_RelationType>(
135 : : ent_or_set2)) );
136 : : }
137 : :
138 : 2 : void iRel_changePairStatus (
139 : : iRel_Instance instance,
140 : : iRel_PairHandle pair,
141 : : int irel_status1,
142 : : int irel_status2,
143 : : int *err)
144 : : {
145 [ - + ]: 2 : CHK_PAIR();
146 : :
147 [ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->change_status(0, static_cast<iRel_RelationStatus>(
148 : : irel_status1)) );
149 [ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->change_status(1, static_cast<iRel_RelationStatus>(
150 : : irel_status2)) );
151 : : }
152 : :
153 : 0 : void iRel_destroyPair (
154 : : iRel_Instance instance,
155 : : iRel_PairHandle pair,
156 : : int *err)
157 : : {
158 [ # # ]: 0 : CHK_PAIR();
159 : :
160 [ # # ]: 0 : CHK_ERROR( LASSOI->erase_pair(ASSOCPAIRI) );
161 : : }
162 : :
163 : 4 : void iRel_findPairs (
164 : : iRel_Instance instance,
165 : : iBase_Instance iface,
166 : : iRel_PairHandle **pairs,
167 : : int *pairs_allocated,
168 : : int *pairs_size,
169 : : int *err
170 : : )
171 : : {
172 : 4 : std::vector<AssocPair*> tmp_pairs;
173 [ + - ]: 4 : LASSOI->find_pairs(iface, tmp_pairs);
174 : :
175 [ + - ][ + - ]: 4 : ALLOC_CHECK_ARRAY_NOFAIL(pairs, tmp_pairs.size());
[ + - ][ + - ]
176 [ + - ][ + + ]: 8 : for (size_t i=0; i<tmp_pairs.size(); ++i) {
177 [ + - ]: 4 : (*pairs)[i] = reinterpret_cast<iRel_PairHandle>(tmp_pairs[i]);
178 : : }
179 : :
180 [ + - ][ + - ]: 4 : RETURN(iBase_SUCCESS);
181 : : }
182 : :
183 : 0 : void iRel_setEntEntRelation (
184 : : iRel_Instance instance,
185 : : iRel_PairHandle pair,
186 : : iBase_EntityHandle ent1,
187 : : iBase_EntityHandle ent2,
188 : : int *err)
189 : : {
190 [ # # ]: 0 : CHK_PAIR();
191 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->set_relation(ent1, ent2) );
192 : : }
193 : :
194 : 3 : void iRel_setEntSetRelation (
195 : : iRel_Instance instance,
196 : : iRel_PairHandle pair,
197 : : iBase_EntityHandle ent1,
198 : : iBase_EntitySetHandle set2,
199 : : int *err)
200 : : {
201 [ - + ]: 3 : CHK_PAIR();
202 [ - + ]: 3 : CHK_ERROR( ASSOCPAIRI->set_relation(ent1, set2) );
203 : : }
204 : :
205 : 0 : void iRel_setSetEntRelation (
206 : : iRel_Instance instance,
207 : : iRel_PairHandle pair,
208 : : iBase_EntitySetHandle set1,
209 : : iBase_EntityHandle ent2,
210 : : int *err)
211 : : {
212 [ # # ]: 0 : CHK_PAIR();
213 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->set_relation(set1, ent2) );
214 : : }
215 : :
216 : 2 : void iRel_setSetSetRelation (
217 : : iRel_Instance instance,
218 : : iRel_PairHandle pair,
219 : : iBase_EntitySetHandle set1,
220 : : iBase_EntitySetHandle set2,
221 : : int *err)
222 : : {
223 [ - + ]: 2 : CHK_PAIR();
224 [ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->set_relation(set1, set2) );
225 : : }
226 : :
227 : 0 : void iRel_setEntArrEntArrRelation (
228 : : iRel_Instance instance,
229 : : iRel_PairHandle pair,
230 : : iBase_EntityHandle *ent_array_1,
231 : : int num_entities1,
232 : : iBase_EntityHandle *ent_array_2,
233 : : int num_entities2,
234 : : int *err)
235 : : {
236 [ # # ]: 0 : CHK_PAIR();
237 : :
238 [ # # ]: 0 : if (num_entities1 != num_entities2)
239 : 0 : ERROR(iBase_INVALID_ENTITY_COUNT, "setEntArrEntArrRelation doesn't support "
240 : : "different #'s of entities.");
241 : :
242 : 0 : int result = iBase_SUCCESS;
243 : : char descr[200];
244 [ # # ]: 0 : for (int i = 0; i < num_entities1; i++) {
245 : 0 : int tmp_result = ASSOCPAIRI->set_relation(ent_array_1[i], ent_array_2[i]);
246 [ # # ][ # # ]: 0 : if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
247 : 0 : result = tmp_result;
248 : 0 : iRel_getDescription(instance, descr, sizeof(descr));
249 : : }
250 : : }
251 : :
252 [ # # ]: 0 : if (result != iBase_SUCCESS)
253 : 0 : ERROR(result, descr);
254 : 0 : RETURN(iBase_SUCCESS);
255 : : }
256 : :
257 : 2 : void iRel_setEntArrSetArrRelation (
258 : : iRel_Instance instance,
259 : : iRel_PairHandle pair,
260 : : iBase_EntityHandle *ent_array_1,
261 : : int num_entities1,
262 : : iBase_EntitySetHandle *set_array_2,
263 : : int num_sets2,
264 : : int *err)
265 : : {
266 [ - + ]: 2 : CHK_PAIR();
267 : :
268 [ - + ]: 2 : if (num_entities1 != num_sets2)
269 : 0 : ERROR(iBase_INVALID_ENTITY_COUNT, "setEntArrSetArrRelation doesn't support "
270 : : "different #'s of entities.");
271 : :
272 : 2 : int result = iBase_SUCCESS;
273 : : char descr[200];
274 [ + + ]: 44 : for (int i = 0; i < num_entities1; i++) {
275 : 42 : int tmp_result = ASSOCPAIRI->set_relation(ent_array_1[i], set_array_2[i]);
276 [ + - ][ - + ]: 42 : if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
277 : 0 : result = tmp_result;
278 : 0 : iRel_getDescription(instance, descr, sizeof(descr));
279 : : }
280 : : }
281 : :
282 [ - + ]: 2 : if (result != iBase_SUCCESS)
283 : 0 : ERROR(result, descr);
284 : 2 : RETURN(iBase_SUCCESS);
285 : : }
286 : :
287 : 0 : void iRel_setSetArrEntArrRelation (
288 : : iRel_Instance instance,
289 : : iRel_PairHandle pair,
290 : : iBase_EntitySetHandle *set_array_1,
291 : : int num_sets1,
292 : : iBase_EntityHandle *ent_array_2,
293 : : int num_entities2,
294 : : int *err)
295 : : {
296 [ # # ]: 0 : CHK_PAIR();
297 : :
298 [ # # ]: 0 : if (num_sets1 != num_entities2)
299 : 0 : ERROR(iBase_INVALID_ENTITY_COUNT, "setSetArrEntArrRelation doesn't support "
300 : : "different #'s of entities.");
301 : :
302 : 0 : int result = iBase_SUCCESS;
303 : : char descr[200];
304 [ # # ]: 0 : for (int i = 0; i < num_sets1; i++) {
305 : 0 : int tmp_result = ASSOCPAIRI->set_relation(set_array_1[i], ent_array_2[i]);
306 [ # # ][ # # ]: 0 : if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
307 : 0 : result = tmp_result;
308 : 0 : iRel_getDescription(instance, descr, sizeof(descr));
309 : : }
310 : : }
311 : :
312 [ # # ]: 0 : if (result != iBase_SUCCESS)
313 : 0 : ERROR(result, descr);
314 : 0 : RETURN(iBase_SUCCESS);
315 : : }
316 : :
317 : 0 : void iRel_setSetArrSetArrRelation (
318 : : iRel_Instance instance,
319 : : iRel_PairHandle pair,
320 : : iBase_EntitySetHandle *set_array_1,
321 : : int num_sets1,
322 : : iBase_EntitySetHandle *set_array_2,
323 : : int num_sets2,
324 : : int *err)
325 : : {
326 [ # # ]: 0 : CHK_PAIR();
327 : :
328 [ # # ]: 0 : if (num_sets1 != num_sets2)
329 : 0 : ERROR(iBase_INVALID_ENTITY_COUNT, "setSetArrSetArrRelation doesn't support "
330 : : "different #'s of entities.");
331 : :
332 : 0 : int result = iBase_SUCCESS;
333 : : char descr[200];
334 [ # # ]: 0 : for (int i = 0; i < num_sets1; i++) {
335 : 0 : int tmp_result = ASSOCPAIRI->set_relation(set_array_1[i], set_array_2[i]);
336 [ # # ][ # # ]: 0 : if (result == iBase_SUCCESS && tmp_result != iBase_SUCCESS) {
337 : 0 : result = tmp_result;
338 : 0 : iRel_getDescription(instance, descr, sizeof(descr));
339 : : }
340 : : }
341 : :
342 [ # # ]: 0 : if (result != iBase_SUCCESS)
343 : 0 : ERROR(result, descr);
344 : 0 : RETURN(iBase_SUCCESS);
345 : : }
346 : :
347 : 4 : void iRel_getEntEntRelation (
348 : : iRel_Instance instance,
349 : : iRel_PairHandle pair,
350 : : iBase_EntityHandle ent1,
351 : : int switch_order,
352 : : iBase_EntityHandle *ent2,
353 : : int *err)
354 : : {
355 [ - + ]: 4 : CHK_PAIR();
356 : :
357 [ + - ]: 4 : int iface_no = (switch_order ? 1 : 0);
358 [ + - ]: 4 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &ent1, 1, ent2) );
359 : : }
360 : :
361 : 0 : void iRel_getEntSetRelation (
362 : : iRel_Instance instance,
363 : : iRel_PairHandle pair,
364 : : iBase_EntityHandle ent1,
365 : : int switch_order,
366 : : iBase_EntitySetHandle *set2,
367 : : int *err)
368 : : {
369 [ # # ]: 0 : CHK_PAIR();
370 : :
371 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);
372 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &ent1, 1, set2) );
373 : : }
374 : :
375 : 0 : void iRel_getSetEntRelation (
376 : : iRel_Instance instance,
377 : : iRel_PairHandle pair,
378 : : iBase_EntitySetHandle set1,
379 : : int switch_order,
380 : : iBase_EntityHandle *ent2,
381 : : int *err)
382 : : {
383 [ # # ]: 0 : CHK_PAIR();
384 : :
385 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);
386 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &set1, 1, ent2) );
387 : : }
388 : :
389 : 6 : void iRel_getSetSetRelation (
390 : : iRel_Instance instance,
391 : : iRel_PairHandle pair,
392 : : iBase_EntitySetHandle set1,
393 : : int switch_order,
394 : : iBase_EntitySetHandle *set2,
395 : : int *err)
396 : : {
397 [ - + ]: 6 : CHK_PAIR();
398 : :
399 [ + + ]: 6 : int iface_no = (switch_order ? 1 : 0);
400 [ + + ]: 6 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &set1, 1, set2) );
401 : : }
402 : :
403 : 0 : void iRel_getEntSetIterRelation (
404 : : iRel_Instance instance,
405 : : iRel_PairHandle pair,
406 : : iBase_EntityHandle ent1,
407 : : int switch_order,
408 : : iBase_EntityIterator *entset2,
409 : : int *err)
410 : : {
411 [ # # ]: 0 : CHK_PAIR();
412 : :
413 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);
414 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, &ent1, 1, entset2) );
415 : : }
416 : :
417 : 2 : void iRel_getEntArrEntArrRelation(
418 : : iRel_Instance instance,
419 : : iRel_PairHandle pair,
420 : : iBase_EntityHandle *ent_array_1,
421 : : int ent_array_1_size,
422 : : int switch_order,
423 : : iBase_EntityHandle **ent_array_2,
424 : : int *ent_array_2_allocated,
425 : : int *ent_array_2_size,
426 : : int *err)
427 : : {
428 [ - + ]: 2 : CHK_PAIR();
429 : :
430 [ + - ]: 2 : int iface_no = (switch_order ? 1 : 0);
431 [ + - ]: 2 : ALLOC_CHECK_ARRAY(ent_array_2, ent_array_1_size);
432 [ + - ][ + - ]: 2 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, ent_array_1, ent_array_1_size,
433 : : *ent_array_2) );
434 : :
435 [ + - ]: 2 : KEEP_ARRAY(ent_array_2);
436 [ + - ]: 2 : RETURN(iBase_SUCCESS);
437 : : }
438 : :
439 : 6 : void iRel_getEntArrSetArrRelation(
440 : : iRel_Instance instance,
441 : : iRel_PairHandle pair,
442 : : iBase_EntityHandle *ent_array_1,
443 : : int ent_array_1_size,
444 : : int switch_order,
445 : : iBase_EntitySetHandle **set_array_2,
446 : : int *set_array_2_allocated,
447 : : int *set_array_2_size,
448 : : int *err)
449 : : {
450 [ - + ]: 6 : CHK_PAIR();
451 : :
452 [ - + ]: 6 : int iface_no = (switch_order ? 1 : 0);
453 [ + - ]: 6 : ALLOC_CHECK_ARRAY(set_array_2, ent_array_1_size);
454 [ + - ][ + + ]: 6 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, ent_array_1, ent_array_1_size,
455 : : *set_array_2) );
456 : :
457 [ + - ]: 4 : KEEP_ARRAY(set_array_2);
458 [ + - ]: 6 : RETURN(iBase_SUCCESS);
459 : : }
460 : :
461 : 4 : void iRel_getSetArrEntArrRelation(
462 : : iRel_Instance instance,
463 : : iRel_PairHandle pair,
464 : : iBase_EntitySetHandle *set_array_1,
465 : : int set_array_1_size,
466 : : int switch_order,
467 : : iBase_EntityHandle **ent_array_2,
468 : : int *ent_array_2_allocated,
469 : : int *ent_array_2_size,
470 : : int *err)
471 : : {
472 [ - + ]: 4 : CHK_PAIR();
473 : :
474 [ + - ]: 4 : int iface_no = (switch_order ? 1 : 0);
475 [ + - ]: 4 : ALLOC_CHECK_ARRAY(ent_array_2, set_array_1_size);
476 [ + - ][ + - ]: 4 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, set_array_1, set_array_1_size,
477 : : *ent_array_2) );
478 : :
479 [ + - ]: 4 : KEEP_ARRAY(ent_array_2);
480 [ + - ]: 4 : RETURN(iBase_SUCCESS);
481 : : }
482 : :
483 : 0 : void iRel_getSetArrSetArrRelation(
484 : : iRel_Instance instance,
485 : : iRel_PairHandle pair,
486 : : iBase_EntitySetHandle *set_array_1,
487 : : int set_array_1_size,
488 : : int switch_order,
489 : : iBase_EntitySetHandle **set_array_2,
490 : : int *set_array_2_allocated,
491 : : int *set_array_2_size,
492 : : int *err)
493 : : {
494 [ # # ]: 0 : CHK_PAIR();
495 : :
496 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);
497 [ # # ]: 0 : ALLOC_CHECK_ARRAY(set_array_2, set_array_1_size);
498 [ # # ][ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, set_array_1, set_array_1_size,
499 : : *set_array_2) );
500 : :
501 [ # # ]: 0 : KEEP_ARRAY(set_array_2);
502 [ # # ]: 0 : RETURN(iBase_SUCCESS);
503 : : }
504 : :
505 : 0 : void iRel_getEntArrSetIterArrRelation (
506 : : iRel_Instance instance,
507 : : iRel_PairHandle pair,
508 : : iBase_EntityHandle *ent_array_1,
509 : : int ent_array_1_size,
510 : : int switch_order,
511 : : iBase_EntityIterator **entiter,
512 : : int *entiter_allocated,
513 : : int *entiter_size,
514 : : int *err)
515 : : {
516 [ # # ]: 0 : CHK_PAIR();
517 : :
518 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);;
519 [ # # ]: 0 : ALLOC_CHECK_ARRAY(entiter, ent_array_1_size);
520 [ # # ][ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->get_relation(iface_no, ent_array_1, ent_array_1_size,
521 : : *entiter) );
522 : :
523 [ # # ]: 0 : KEEP_ARRAY(entiter);
524 [ # # ]: 0 : RETURN(iBase_SUCCESS);
525 : : }
526 : :
527 : :
528 : 0 : void iRel_rmvEntRelation(
529 : : iRel_Instance instance,
530 : : /*in*/ iRel_PairHandle pair,
531 : : /*in*/ iBase_EntityHandle ent,
532 : : /*in*/ int switch_order,
533 : : /*out*/ int *err)
534 : : {
535 [ # # ]: 0 : CHK_PAIR();
536 : :
537 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);
538 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, &ent, 1) );
539 : : }
540 : :
541 : 0 : void iRel_rmvSetRelation(
542 : : iRel_Instance instance,
543 : : /*in*/ iRel_PairHandle pair,
544 : : /*in*/ iBase_EntitySetHandle entset,
545 : : /*in*/ int switch_order,
546 : : /*out*/ int *err)
547 : : {
548 [ # # ]: 0 : CHK_PAIR();
549 : :
550 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);
551 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, &entset, 1) );
552 : : }
553 : :
554 : 2 : void iRel_rmvEntArrRelation(
555 : : iRel_Instance instance,
556 : : /*in*/ iRel_PairHandle pair,
557 : : /*in*/ iBase_EntityHandle *ent_array,
558 : : /*in*/ int num_ent,
559 : : /*in*/ int switch_order,
560 : : /*out*/ int *err)
561 : : {
562 [ - + ]: 2 : CHK_PAIR();
563 : :
564 [ - + ]: 2 : int iface_no = (switch_order ? 1 : 0);
565 [ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, ent_array, num_ent) );
566 : : }
567 : :
568 : 0 : void iRel_rmvSetArrRelation(
569 : : iRel_Instance instance,
570 : : /*in*/ iRel_PairHandle pair,
571 : : /*in*/ iBase_EntitySetHandle *entset_array,
572 : : /*in*/ int num_ent,
573 : : /*in*/ int switch_order,
574 : : /*out*/ int *err)
575 : : {
576 [ # # ]: 0 : CHK_PAIR();
577 : :
578 [ # # ]: 0 : int iface_no = (switch_order ? 1 : 0);
579 [ # # ]: 0 : CHK_ERROR( ASSOCPAIRI->rmv_relation(iface_no, entset_array, num_ent) );
580 : : }
581 : :
582 : : static int
583 : 12 : get_gids_and_dims(iRel_PairHandle pair,
584 : : int iface_no,
585 : : iBase_EntityHandle *ents,
586 : : int ents_size,
587 : : int ent_or_set,
588 : : std::vector<int> &ents_gids,
589 : : std::vector<int> &ents_dims)
590 : : {
591 : : int result;
592 : 12 : iBase_EntitySetHandle *sets = reinterpret_cast<iBase_EntitySetHandle*>(ents);
593 : :
594 : 12 : ents_gids.resize(ents_size);
595 [ + + ]: 12 : if (ent_or_set == iRel_ENTITY)
596 : 6 : result = ASSOCPAIRI->get_gids(iface_no, ents, ents_size, &ents_gids[0]);
597 : : else
598 : 6 : result = ASSOCPAIRI->get_gids(iface_no, sets, ents_size, &ents_gids[0]);
599 : :
600 [ - + ][ # # ]: 12 : if (iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result)
601 : 0 : return result;
602 : :
603 : 12 : ents_dims.resize(ents_size, -1);
604 [ + + ]: 12 : if (ent_or_set == iRel_ENTITY) {
605 : 6 : int *ents_dims_ptr = &ents_dims[0];
606 : 6 : int ents_dims_alloc = ents_dims.size(), ents_dims_size;
607 : : result = ASSOCPAIRI->get_ents_dims(iface_no, ents, ents_size,
608 : : &ents_dims_ptr, &ents_dims_alloc,
609 : 6 : &ents_dims_size);
610 : : }
611 : : else {
612 : 6 : result = ASSOCPAIRI->get_dims(iface_no, sets, ents_size, &ents_dims[0]);
613 : : }
614 : :
615 [ - + ][ # # ]: 12 : if (iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result)
616 : 0 : return result;
617 : :
618 : 12 : return iBase_SUCCESS;
619 : : }
620 : :
621 : : static void
622 : 6 : iRel_inferArrArrRelations(iRel_Instance instance,
623 : : iRel_PairHandle pair,
624 : : iBase_EntityHandle *ents1,
625 : : const int ents1_size,
626 : : int ent_or_set1,
627 : : iBase_EntityHandle *ents2,
628 : : const int ents2_size,
629 : : int ent_or_set2,
630 : : int *err)
631 : : {
632 : : int result;
633 : :
634 [ + - ]: 6 : std::vector<int> ents_gids, ents_dims;
635 [ + - ][ + + ]: 54 : std::map<const int, iBase_EntityHandle> ents_gid_map[4];
[ + - ][ # # ]
[ # # ]
636 : :
637 : : get_gids_and_dims(pair, 0, ents1, ents1_size, ent_or_set1, ents_gids,
638 [ + - ]: 6 : ents_dims);
639 [ + + ]: 104 : for (int i = 0; i < ents1_size; i++) {
640 [ + - ]: 98 : int dim = ents_dims[i];
641 [ + - ][ + - ]: 98 : if (0 <= dim && 3 >= dim)
642 [ + - ][ + - ]: 98 : ents_gid_map[dim][ents_gids[i]] = ents1[i];
643 : : }
644 : :
645 : : get_gids_and_dims(pair, 1, ents2, ents2_size, ent_or_set2, ents_gids,
646 [ + - ]: 6 : ents_dims);
647 [ + + ]: 109 : for (int i = 0; i < ents2_size; i++) {
648 [ + - ]: 103 : int dim = ents_dims[i];
649 : :
650 : : // only check entities for which the dimension entry is in a reasonable
651 : : // range
652 [ + - ][ - + ]: 103 : if (0 > dim || 3 < dim) continue;
653 : :
654 : : // there's a match if there's an entity with that dimension with matching id
655 : : std::map<const int, iBase_EntityHandle>::iterator iter =
656 [ + - ][ + - ]: 103 : ents_gid_map[dim].find(ents_gids[i]);
657 : :
658 : : // if it matches, set the relation tags for those entities
659 [ + - ][ + - ]: 103 : if (iter != ents_gid_map[dim].end()) {
[ + + ]
660 [ + - ][ - + ]: 75 : if (ent_or_set1 == iRel_ENTITY && ent_or_set2 == iRel_ENTITY) {
661 : : result = ASSOCPAIRI->set_relation(
662 [ # # ]: 0 : (*iter).second,
663 [ # # ]: 0 : ents2[i]);
664 : : }
665 [ - + ][ # # ]: 75 : else if (ent_or_set1 != iRel_ENTITY && ent_or_set2 == iRel_ENTITY) {
666 : : result = ASSOCPAIRI->set_relation(
667 [ # # ]: 0 : (iBase_EntitySetHandle)(*iter).second,
668 [ # # ]: 0 : ents2[i]);
669 : : }
670 [ + - ][ + - ]: 75 : else if (ent_or_set1 == iRel_ENTITY && ent_or_set2 != iRel_ENTITY) {
671 : : result = ASSOCPAIRI->set_relation(
672 [ + - ]: 75 : (*iter).second,
673 [ + - ]: 75 : (iBase_EntitySetHandle)ents2[i]);
674 : : }
675 : : else { // ent_or_set1 != iRel_ENTITY && ent_or_set2 != iRel_ENTITY
676 : : result = ASSOCPAIRI->set_relation(
677 [ # # ]: 0 : (iBase_EntitySetHandle)(*iter).second,
678 [ # # ]: 0 : (iBase_EntitySetHandle)ents2[i]);
679 : : }
680 : :
681 [ + - ]: 75 : CHK_ERROR(result);
682 : : }
683 : : }
684 : :
685 [ + - ][ + + ]: 30 : RETURN(iBase_SUCCESS);
[ + - ][ # # ]
686 : : }
687 : :
688 : : void
689 : 0 : iRel_inferEntArrEntArrRelations(iRel_Instance instance,
690 : : iRel_PairHandle pair,
691 : : iBase_EntityHandle *ents1,
692 : : const int ents1_size,
693 : : iBase_EntityHandle *ents2,
694 : : const int ents2_size,
695 : : int *err)
696 : : {
697 : : iRel_inferArrArrRelations(instance, pair, ents1, ents1_size, 0,
698 : 0 : ents2, ents2_size, 0, err);
699 : 0 : }
700 : :
701 : : void
702 : 0 : iRel_inferEntArrSetArrRelations(iRel_Instance instance,
703 : : iRel_PairHandle pair,
704 : : iBase_EntityHandle *ents1,
705 : : const int ents1_size,
706 : : iBase_EntitySetHandle *ents2,
707 : : const int ents2_size,
708 : : int *err)
709 : : {
710 : : iRel_inferArrArrRelations(instance, pair, ents1, ents1_size, 0,
711 : 0 : (iBase_EntityHandle*)ents2, ents2_size, 1, err);
712 : 0 : }
713 : :
714 : : void
715 : 0 : iRel_inferSetArrEntArrRelations(iRel_Instance instance,
716 : : iRel_PairHandle pair,
717 : : iBase_EntitySetHandle *ents1,
718 : : const int ents1_size,
719 : : iBase_EntityHandle *ents2,
720 : : const int ents2_size,
721 : : int *err)
722 : : {
723 : : iRel_inferArrArrRelations(instance, pair, (iBase_EntityHandle*)ents1,
724 : 0 : ents1_size, 1, ents2, ents2_size, 0, err);
725 : 0 : }
726 : :
727 : : void
728 : 0 : iRel_inferSetArrSetArrRelations(iRel_Instance instance,
729 : : iRel_PairHandle pair,
730 : : iBase_EntitySetHandle *ents1,
731 : : const int ents1_size,
732 : : int is_set1,
733 : : iBase_EntitySetHandle *ents2,
734 : : const int ents2_size,
735 : : int is_set2,
736 : : int *err)
737 : :
738 : : {
739 : : iRel_inferArrArrRelations(instance, pair, (iBase_EntityHandle*)ents1,
740 : : ents1_size, 1, (iBase_EntityHandle*)ents2,
741 : 0 : ents2_size, 1, err);
742 : 0 : }
743 : :
744 : 2 : void iRel_inferAllRelations (
745 : : iRel_Instance instance,
746 : : iRel_PairHandle pair,
747 : : int *err)
748 : : {
749 [ - + ]: 2 : CHK_PAIR();
750 : :
751 : : // get all entities in those interfaces
752 : : int result;
753 : :
754 : 2 : iBase_EntityHandle *ents1 = NULL;
755 : 2 : int ents1_alloc = 0, ents1_size;
756 [ - + ]: 2 : if (ASSOCPAIRI->relation_type(0) != iRel_ENTITY)
757 : : result = ASSOCPAIRI->get_all_sets(0, (iBase_EntitySetHandle**)&ents1,
758 : 0 : &ents1_alloc, &ents1_size);
759 : : else
760 : : result = ASSOCPAIRI->get_all_entities(0, -1, &ents1, &ents1_alloc,
761 : 2 : &ents1_size);
762 [ - + ]: 2 : CHK_ERROR(result);
763 : :
764 : 2 : iBase_EntityHandle *ents2 = NULL;
765 : 2 : int ents2_alloc = 0, ents2_size;
766 [ + - ]: 2 : if (ASSOCPAIRI->relation_type(1) != iRel_ENTITY)
767 : : result = ASSOCPAIRI->get_all_sets(1, (iBase_EntitySetHandle**)&ents2,
768 : 2 : &ents2_alloc, &ents2_size);
769 : : else
770 : : result = ASSOCPAIRI->get_all_entities(1, -1, &ents2, &ents2_alloc,
771 : 0 : &ents2_size);
772 [ - + ]: 2 : CHK_ERROR(result);
773 : :
774 : : iRel_inferArrArrRelations(instance, pair,
775 : 2 : ents1, ents1_size, ASSOCPAIRI->relation_type(0),
776 : 2 : ents2, ents2_size, ASSOCPAIRI->relation_type(1),
777 : 2 : &result);
778 : :
779 : 2 : free(ents1); free(ents2);
780 [ - + ]: 2 : CHK_ERROR(result);
781 : : }
782 : :
783 : 0 : void iRel_inferAllRelationsAndType (
784 : : iRel_Instance instance,
785 : : iRel_PairHandle *pair,
786 : : int *err)
787 : : {
788 : 0 : ERROR(iBase_NOT_SUPPORTED, "Not currently supported.");
789 : : }
790 : :
791 : 0 : void iRel_inferEntRelations (
792 : : iRel_Instance instance,
793 : : iRel_PairHandle pair,
794 : : iBase_EntityHandle entity,
795 : : int iface_no,
796 : : int *err)
797 : : {
798 : 0 : iRel_inferEntArrRelations(instance, pair, &entity, 1, iface_no, err);
799 : 0 : }
800 : :
801 : 0 : void iRel_inferSetRelations (
802 : : iRel_Instance instance,
803 : : iRel_PairHandle pair,
804 : : iBase_EntitySetHandle entity,
805 : : int iface_no,
806 : : int *err)
807 : : {
808 : 0 : iRel_inferSetArrRelations(instance, pair, &entity, 1, iface_no, err);
809 : 0 : }
810 : :
811 : 4 : static void iRel_inferArrRelations (
812 : : iRel_Instance instance,
813 : : iRel_PairHandle pair,
814 : : iBase_EntityHandle *entities,
815 : : int entities_size,
816 : : bool is_set,
817 : : int iface_no,
818 : : int *err)
819 : : {
820 [ - + ]: 4 : CHK_PAIR();
821 : :
822 [ + - ][ - + ]: 4 : if (0 > iface_no || 1 < iface_no) {
823 : 0 : ERROR(iBase_INVALID_ARGUMENT, "Interface number must be 0 or 1");
824 : : }
825 [ + + ][ + - ]: 6 : else if (( is_set && ASSOCPAIRI->relation_type(iface_no) == iRel_ENTITY) ||
[ + + - + ]
[ - + ]
826 : 2 : (!is_set && ASSOCPAIRI->relation_type(iface_no) != iRel_ENTITY)) {
827 : 0 : ERROR(iBase_INVALID_ARGUMENT, "is_set must match entOrSet in call to "
828 : : "inferArrRelations");
829 : : }
830 : :
831 : : // get all entities in iface2
832 : : int result;
833 : 4 : iBase_EntityHandle *ents1 = entities;
834 : 4 : int ents1_size = entities_size;
835 : 4 : iBase_EntityHandle *ents2 = NULL;
836 : 4 : int ents2_alloc = 0, ents2_size;
837 [ + + ]: 4 : if (ASSOCPAIRI->relation_type(1-iface_no) != iRel_ENTITY)
838 : : result = ASSOCPAIRI->get_all_sets(!iface_no,
839 : : (iBase_EntitySetHandle**)&ents2,
840 : 2 : &ents2_alloc, &ents2_size);
841 : : else
842 : : result = ASSOCPAIRI->get_all_entities(!iface_no, -1,
843 : 2 : &ents2, &ents2_alloc, &ents2_size);
844 [ - + ]: 4 : CHK_ERROR(result);
845 : :
846 : : // switch so that entity lists always go into inferArrArrRelations in
847 : : // forward order wrt pair
848 [ + + ]: 4 : if (1 == iface_no) {
849 : 2 : std::swap(ents1, ents2);
850 : 2 : std::swap(ents1_size, ents2_size);
851 : : }
852 : :
853 : : iRel_inferArrArrRelations(instance, pair,
854 : : ents1, ents1_size,
855 : 4 : ASSOCPAIRI->relation_type(0),
856 : : ents2, ents2_size,
857 : 8 : ASSOCPAIRI->relation_type(1), &result);
858 : :
859 [ + + ]: 4 : free(1 == iface_no ? ents1 : ents2);
860 : :
861 [ - + ]: 4 : CHK_ERROR(result);
862 : : }
863 : :
864 : 2 : void iRel_inferEntArrRelations (
865 : : iRel_Instance instance,
866 : : iRel_PairHandle pair,
867 : : iBase_EntityHandle *entities,
868 : : int entities_size,
869 : : int iface_no,
870 : : int *err)
871 : : {
872 : : iRel_inferArrRelations(instance, pair, entities, entities_size, false,
873 : 2 : iface_no, err);
874 : 2 : }
875 : :
876 : 2 : void iRel_inferSetArrRelations (
877 : : iRel_Instance instance,
878 : : iRel_PairHandle pair,
879 : : iBase_EntitySetHandle *entities,
880 : : int entities_size,
881 : : int iface_no,
882 : : int *err)
883 : : {
884 : : iRel_inferArrRelations(instance, pair, (iBase_EntityHandle*)entities,
885 : 2 : entities_size, true, iface_no, err);
886 [ + - ][ + - ]: 14 : }
|