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 ) { strcpy( descr, "iRel_getDescription: Invalid instance" ); }
38 : : else
39 : : {
40 [ # # ]: 0 : unsigned int len = std::min( strlen( LASSOI->lastErrorDescription ), static_cast< size_t >( descr_len ) );
41 : 0 : strncpy( descr, LASSOI->lastErrorDescription, len );
42 : 0 : descr[len] = '\0';
43 : : }
44 : 0 : }
45 : :
46 : 5 : void iRel_create( /* in */ const char* /* options */, iRel_Instance* instance, int* err, const int options_len )
47 : : {
48 [ - + ]: 5 : if( 0 != options_len )
49 : : {
50 : 0 : *instance = NULL;
51 : 0 : *err = iBase_NOT_SUPPORTED;
52 : : }
53 : :
54 [ + - ]: 5 : *instance = new Lasso();
55 : 5 : *err = iBase_SUCCESS;
56 : 5 : }
57 : :
58 : 5 : void iRel_destroy( iRel_Instance instance, int* err )
59 : : {
60 [ + - ]: 5 : delete LASSOI;
61 : 5 : *err = iBase_SUCCESS;
62 : 5 : }
63 : :
64 : 8 : void iRel_createPair( iRel_Instance instance, iBase_Instance iface1, const int ent_or_set1, const int iface_type1,
65 : : const int irel_status1, iBase_Instance iface2, const int ent_or_set2, const int iface_type2,
66 : : const int irel_status2, iRel_PairHandle* pair, int* err )
67 : : {
68 : : AssocPair* assoc_pair = new AssocPair(
69 : : instance, iface1, static_cast< iRel_RelationType >( ent_or_set1 ), static_cast< iRel_IfaceType >( iface_type1 ),
70 : : static_cast< iRel_RelationStatus >( irel_status1 ), iface2, static_cast< iRel_RelationType >( ent_or_set2 ),
71 [ + - ]: 8 : static_cast< iRel_IfaceType >( iface_type2 ), static_cast< iRel_RelationStatus >( irel_status2 ) );
72 : 8 : LASSOI->insert_pair( assoc_pair );
73 : :
74 : 8 : *pair = reinterpret_cast< iRel_PairHandle >( assoc_pair );
75 : 8 : RETURN( iBase_SUCCESS );
76 : : }
77 : :
78 : 3 : void iRel_getPairInfo( iRel_Instance instance, iRel_PairHandle pair, iBase_Instance* iface1, int* ent_or_set1,
79 : : int* iface_type1, int* irel_status1, iBase_Instance* iface2, int* ent_or_set2, int* iface_type2,
80 : : int* irel_status2, int* err )
81 : : {
82 [ - + ]: 3 : CHK_PAIR();
83 : :
84 : 3 : *iface1 = ASSOCPAIRI->iface_instance( 0 );
85 : 3 : *ent_or_set1 = ASSOCPAIRI->relation_type( 0 );
86 : 3 : *iface_type1 = ASSOCPAIRI->iface_type( 0 );
87 : 3 : *irel_status1 = ASSOCPAIRI->relation_status( 0 );
88 : 3 : *iface2 = ASSOCPAIRI->iface_instance( 1 );
89 : 3 : *iface_type2 = ASSOCPAIRI->iface_type( 1 );
90 : 3 : *ent_or_set2 = ASSOCPAIRI->relation_type( 1 );
91 : 3 : *irel_status2 = ASSOCPAIRI->relation_status( 1 );
92 : :
93 : 3 : RETURN( iBase_SUCCESS );
94 : : }
95 : :
96 : 2 : void iRel_changePairType( iRel_Instance instance, iRel_PairHandle pair, int ent_or_set1, int ent_or_set2, int* err )
97 : : {
98 [ - + ]: 2 : CHK_PAIR();
99 : :
100 [ - + ][ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->change_type( 0, static_cast< iRel_RelationType >( ent_or_set1 ) ) );CHK_ERROR( ASSOCPAIRI->change_type( 1, static_cast< iRel_RelationType >( ent_or_set2 ) ) );
101 : : }
102 : :
103 : 2 : void iRel_changePairStatus( iRel_Instance instance, iRel_PairHandle pair, int irel_status1, int irel_status2, int* err )
104 : : {
105 [ - + ]: 2 : CHK_PAIR();
106 : :
107 [ - + ][ - + ]: 2 : CHK_ERROR( ASSOCPAIRI->change_status( 0, static_cast< iRel_RelationStatus >( irel_status1 ) ) );CHK_ERROR( ASSOCPAIRI->change_status( 1, static_cast< iRel_RelationStatus >( irel_status2 ) ) );
108 : : }
109 : :
110 : 0 : void iRel_destroyPair( iRel_Instance instance, iRel_PairHandle pair, int* err )
111 : : {
112 [ # # ]: 0 : CHK_PAIR();
113 : :
114 [ # # ]: 0 : CHK_ERROR( LASSOI->erase_pair( ASSOCPAIRI ) );
115 : : }
116 : :
117 : 6 : void iRel_findPairs( iRel_Instance instance, iBase_Instance iface, iRel_PairHandle** pairs, int* pairs_allocated,
118 : : int* pairs_size, int* err )
119 : : {
120 [ + - ]: 6 : std::vector< AssocPair* > tmp_pairs;
121 [ + - ]: 6 : LASSOI->find_pairs( iface, tmp_pairs );
122 : :
123 [ + - ][ - + ]: 12 : ALLOC_CHECK_ARRAY_NOFAIL( pairs, tmp_pairs.size() );
[ + - ]
124 [ + + ]: 12 : for( size_t i = 0; i < tmp_pairs.size(); ++i )
125 : : {
126 [ + - ]: 6 : ( *pairs )[i] = reinterpret_cast< iRel_PairHandle >( tmp_pairs[i] );
127 : : }
128 : :
129 [ + - ]: 12 : RETURN( iBase_SUCCESS );
130 : : }
131 : :
132 : 0 : void iRel_setEntEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1,
133 : : iBase_EntityHandle ent2, int* err )
134 : : {
135 [ # # ][ # # ]: 0 : CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( ent1, ent2 ) );
136 : : }
137 : :
138 : 3 : void iRel_setEntSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1,
139 : : iBase_EntitySetHandle set2, int* err )
140 : : {
141 [ - + ][ - + ]: 3 : CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( ent1, set2 ) );
142 : : }
143 : :
144 : 0 : void iRel_setSetEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1,
145 : : iBase_EntityHandle ent2, int* err )
146 : : {
147 [ # # ][ # # ]: 0 : CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( set1, ent2 ) );
148 : : }
149 : :
150 : 2 : void iRel_setSetSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1,
151 : : iBase_EntitySetHandle set2, int* err )
152 : : {
153 [ - + ][ - + ]: 2 : CHK_PAIR();CHK_ERROR( ASSOCPAIRI->set_relation( set1, set2 ) );
154 : : }
155 : :
156 : 0 : void iRel_setEntArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
157 : : int num_entities1, iBase_EntityHandle* ent_array_2, int num_entities2, int* err )
158 : : {
159 [ # # ][ # # ]: 0 : CHK_PAIR();
160 : :
161 [ # # ]: 0 : if( num_entities1 != num_entities2 )
162 [ # # ]: 0 : ERROR( iBase_INVALID_ENTITY_COUNT, "setEntArrEntArrRelation doesn't support "
163 : : "different #'s of entities." );
164 : :
165 : 0 : int result = iBase_SUCCESS;
166 : : char descr[200];
167 [ # # ]: 0 : for( int i = 0; i < num_entities1; i++ )
168 : : {
169 [ # # ]: 0 : int tmp_result = ASSOCPAIRI->set_relation( ent_array_1[i], ent_array_2[i] );
170 [ # # ][ # # ]: 0 : if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
171 : : {
172 : 0 : result = tmp_result;
173 [ # # ]: 0 : iRel_getDescription( instance, descr, sizeof( descr ) );
174 : : }
175 : : }
176 : :
177 [ # # ][ # # ]: 0 : if( result != iBase_SUCCESS ) ERROR( result, descr );
178 [ # # ]: 0 : RETURN( iBase_SUCCESS );
179 : : }
180 : :
181 : 2 : void iRel_setEntArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
182 : : int num_entities1, iBase_EntitySetHandle* set_array_2, int num_sets2, int* err )
183 : : {
184 [ - + ][ # # ]: 2 : CHK_PAIR();
185 : :
186 [ - + ]: 2 : if( num_entities1 != num_sets2 )
187 [ # # ]: 0 : ERROR( iBase_INVALID_ENTITY_COUNT, "setEntArrSetArrRelation doesn't support "
188 : : "different #'s of entities." );
189 : :
190 : 2 : int result = iBase_SUCCESS;
191 : : char descr[200];
192 [ + + ]: 44 : for( int i = 0; i < num_entities1; i++ )
193 : : {
194 [ + - ]: 42 : int tmp_result = ASSOCPAIRI->set_relation( ent_array_1[i], set_array_2[i] );
195 [ + - ][ - + ]: 42 : if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
196 : : {
197 : 0 : result = tmp_result;
198 [ # # ]: 0 : iRel_getDescription( instance, descr, sizeof( descr ) );
199 : : }
200 : : }
201 : :
202 [ - + ][ # # ]: 2 : if( result != iBase_SUCCESS ) ERROR( result, descr );
203 [ + - ]: 2 : RETURN( iBase_SUCCESS );
204 : : }
205 : :
206 : 0 : void iRel_setSetArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
207 : : int num_sets1, iBase_EntityHandle* ent_array_2, int num_entities2, int* err )
208 : : {
209 [ # # ][ # # ]: 0 : CHK_PAIR();
210 : :
211 [ # # ]: 0 : if( num_sets1 != num_entities2 )
212 [ # # ]: 0 : ERROR( iBase_INVALID_ENTITY_COUNT, "setSetArrEntArrRelation doesn't support "
213 : : "different #'s of entities." );
214 : :
215 : 0 : int result = iBase_SUCCESS;
216 : : char descr[200];
217 [ # # ]: 0 : for( int i = 0; i < num_sets1; i++ )
218 : : {
219 [ # # ]: 0 : int tmp_result = ASSOCPAIRI->set_relation( set_array_1[i], ent_array_2[i] );
220 [ # # ][ # # ]: 0 : if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
221 : : {
222 : 0 : result = tmp_result;
223 [ # # ]: 0 : iRel_getDescription( instance, descr, sizeof( descr ) );
224 : : }
225 : : }
226 : :
227 [ # # ][ # # ]: 0 : if( result != iBase_SUCCESS ) ERROR( result, descr );
228 [ # # ]: 0 : RETURN( iBase_SUCCESS );
229 : : }
230 : :
231 : 0 : void iRel_setSetArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
232 : : int num_sets1, iBase_EntitySetHandle* set_array_2, int num_sets2, int* err )
233 : : {
234 [ # # ][ # # ]: 0 : CHK_PAIR();
235 : :
236 [ # # ]: 0 : if( num_sets1 != num_sets2 )
237 [ # # ]: 0 : ERROR( iBase_INVALID_ENTITY_COUNT, "setSetArrSetArrRelation doesn't support "
238 : : "different #'s of entities." );
239 : :
240 : 0 : int result = iBase_SUCCESS;
241 : : char descr[200];
242 [ # # ]: 0 : for( int i = 0; i < num_sets1; i++ )
243 : : {
244 [ # # ]: 0 : int tmp_result = ASSOCPAIRI->set_relation( set_array_1[i], set_array_2[i] );
245 [ # # ][ # # ]: 0 : if( result == iBase_SUCCESS && tmp_result != iBase_SUCCESS )
246 : : {
247 : 0 : result = tmp_result;
248 [ # # ]: 0 : iRel_getDescription( instance, descr, sizeof( descr ) );
249 : : }
250 : : }
251 : :
252 [ # # ][ # # ]: 0 : if( result != iBase_SUCCESS ) ERROR( result, descr );
253 [ # # ]: 0 : RETURN( iBase_SUCCESS );
254 : : }
255 : :
256 : 4 : void iRel_getEntEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1, int switch_order,
257 : : iBase_EntityHandle* ent2, int* err )
258 : : {
259 [ - + ]: 4 : CHK_PAIR();
260 : :
261 [ + - ][ + - ]: 4 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &ent1, 1, ent2 ) );
262 : : }
263 : :
264 : 0 : void iRel_getEntSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1, int switch_order,
265 : : iBase_EntitySetHandle* set2, int* err )
266 : : {
267 [ # # ]: 0 : CHK_PAIR();
268 : :
269 [ # # ][ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &ent1, 1, set2 ) );
270 : : }
271 : :
272 : 0 : void iRel_getSetEntRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1, int switch_order,
273 : : iBase_EntityHandle* ent2, int* err )
274 : : {
275 [ # # ]: 0 : CHK_PAIR();
276 : :
277 [ # # ][ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &set1, 1, ent2 ) );
278 : : }
279 : :
280 : 6 : void iRel_getSetSetRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle set1, int switch_order,
281 : : iBase_EntitySetHandle* set2, int* err )
282 : : {
283 [ - + ]: 6 : CHK_PAIR();
284 : :
285 [ + + ][ + + ]: 6 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &set1, 1, set2 ) );
286 : : }
287 : :
288 : 0 : void iRel_getEntSetIterRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle ent1,
289 : : int switch_order, iBase_EntityIterator* entset2, int* err )
290 : : {
291 [ # # ]: 0 : CHK_PAIR();
292 : :
293 [ # # ][ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, &ent1, 1, entset2 ) );
294 : : }
295 : :
296 : 2 : void iRel_getEntArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
297 : : int ent_array_1_size, int switch_order, iBase_EntityHandle** ent_array_2,
298 : : int* ent_array_2_allocated, int* ent_array_2_size, int* err )
299 : : {
300 [ - + ][ # # ]: 2 : CHK_PAIR();
301 : :
302 [ + - ]: 2 : int iface_no = ( switch_order ? 1 : 0 );
303 [ + - ][ - + ]: 2 : ALLOC_CHECK_ARRAY( ent_array_2, ent_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, ent_array_1, ent_array_1_size, *ent_array_2 ) );
[ + - ][ - + ]
304 : :
305 [ + - ]: 2 : KEEP_ARRAY( ent_array_2 );
306 [ + - ]: 2 : RETURN( iBase_SUCCESS );
307 : : }
308 : :
309 : 9 : void iRel_getEntArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
310 : : int ent_array_1_size, int switch_order, iBase_EntitySetHandle** set_array_2,
311 : : int* set_array_2_allocated, int* set_array_2_size, int* err )
312 : : {
313 [ - + ][ # # ]: 9 : CHK_PAIR();
314 : :
315 [ - + ]: 9 : int iface_no = ( switch_order ? 1 : 0 );
316 [ + - ][ - + ]: 9 : ALLOC_CHECK_ARRAY( set_array_2, ent_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, ent_array_1, ent_array_1_size, *set_array_2 ) );
[ + - ][ + + ]
317 : :
318 [ + - ]: 7 : KEEP_ARRAY( set_array_2 );
319 [ + - ]: 9 : RETURN( iBase_SUCCESS );
320 : : }
321 : :
322 : 4 : void iRel_getSetArrEntArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
323 : : int set_array_1_size, int switch_order, iBase_EntityHandle** ent_array_2,
324 : : int* ent_array_2_allocated, int* ent_array_2_size, int* err )
325 : : {
326 [ - + ][ # # ]: 4 : CHK_PAIR();
327 : :
328 [ + - ]: 4 : int iface_no = ( switch_order ? 1 : 0 );
329 [ + - ][ - + ]: 4 : ALLOC_CHECK_ARRAY( ent_array_2, set_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, set_array_1, set_array_1_size, *ent_array_2 ) );
[ + - ][ - + ]
330 : :
331 [ + - ]: 4 : KEEP_ARRAY( ent_array_2 );
332 [ + - ]: 4 : RETURN( iBase_SUCCESS );
333 : : }
334 : :
335 : 0 : void iRel_getSetArrSetArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* set_array_1,
336 : : int set_array_1_size, int switch_order, iBase_EntitySetHandle** set_array_2,
337 : : int* set_array_2_allocated, int* set_array_2_size, int* err )
338 : : {
339 [ # # ][ # # ]: 0 : CHK_PAIR();
340 : :
341 [ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );
342 [ # # ][ # # ]: 0 : ALLOC_CHECK_ARRAY( set_array_2, set_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, set_array_1, set_array_1_size, *set_array_2 ) );
[ # # ][ # # ]
343 : :
344 [ # # ]: 0 : KEEP_ARRAY( set_array_2 );
345 [ # # ]: 0 : RETURN( iBase_SUCCESS );
346 : : }
347 : :
348 : 0 : void iRel_getEntArrSetIterArrRelation( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ent_array_1,
349 : : int ent_array_1_size, int switch_order, iBase_EntityIterator** entiter,
350 : : int* entiter_allocated, int* entiter_size, int* err )
351 : : {
352 [ # # ][ # # ]: 0 : CHK_PAIR();
353 : :
354 [ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );
355 : : ;
356 [ # # ][ # # ]: 0 : ALLOC_CHECK_ARRAY( entiter, ent_array_1_size );CHK_ERROR( ASSOCPAIRI->get_relation( iface_no, ent_array_1, ent_array_1_size, *entiter ) );
[ # # ][ # # ]
357 : :
358 [ # # ]: 0 : KEEP_ARRAY( entiter );
359 [ # # ]: 0 : RETURN( iBase_SUCCESS );
360 : : }
361 : :
362 : 0 : void iRel_rmvEntRelation( iRel_Instance instance,
363 : : /*in*/ iRel_PairHandle pair,
364 : : /*in*/ iBase_EntityHandle ent,
365 : : /*in*/ int switch_order,
366 : : /*out*/ int* err )
367 : : {
368 [ # # ]: 0 : CHK_PAIR();
369 : :
370 [ # # ][ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, &ent, 1 ) );
371 : : }
372 : :
373 : 0 : void iRel_rmvSetRelation( iRel_Instance instance,
374 : : /*in*/ iRel_PairHandle pair,
375 : : /*in*/ iBase_EntitySetHandle entset,
376 : : /*in*/ int switch_order,
377 : : /*out*/ int* err )
378 : : {
379 [ # # ]: 0 : CHK_PAIR();
380 : :
381 [ # # ][ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, &entset, 1 ) );
382 : : }
383 : :
384 : 3 : void iRel_rmvEntArrRelation( iRel_Instance instance,
385 : : /*in*/ iRel_PairHandle pair,
386 : : /*in*/ iBase_EntityHandle* ent_array,
387 : : /*in*/ int num_ent,
388 : : /*in*/ int switch_order,
389 : : /*out*/ int* err )
390 : : {
391 [ - + ]: 3 : CHK_PAIR();
392 : :
393 [ - + ][ - + ]: 3 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, ent_array, num_ent ) );
394 : : }
395 : :
396 : 0 : void iRel_rmvSetArrRelation( iRel_Instance instance,
397 : : /*in*/ iRel_PairHandle pair,
398 : : /*in*/ iBase_EntitySetHandle* entset_array,
399 : : /*in*/ int num_ent,
400 : : /*in*/ int switch_order,
401 : : /*out*/ int* err )
402 : : {
403 [ # # ]: 0 : CHK_PAIR();
404 : :
405 [ # # ][ # # ]: 0 : int iface_no = ( switch_order ? 1 : 0 );CHK_ERROR( ASSOCPAIRI->rmv_relation( iface_no, entset_array, num_ent ) );
406 : : }
407 : :
408 : 18 : static int get_gids_and_dims( iRel_PairHandle pair, int iface_no, iBase_EntityHandle* ents, int ents_size,
409 : : int ent_or_set, std::vector< int >& ents_gids, std::vector< int >& ents_dims )
410 : : {
411 : : int result;
412 : 18 : iBase_EntitySetHandle* sets = reinterpret_cast< iBase_EntitySetHandle* >( ents );
413 : :
414 : 18 : ents_gids.resize( ents_size );
415 [ + + ]: 18 : if( ent_or_set == iRel_ENTITY )
416 : 9 : result = ASSOCPAIRI->get_gids( iface_no, ents, ents_size, &ents_gids[0] );
417 : : else
418 : 9 : result = ASSOCPAIRI->get_gids( iface_no, sets, ents_size, &ents_gids[0] );
419 : :
420 [ - + ][ # # ]: 18 : if( iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result ) return result;
421 : :
422 [ + - ]: 18 : ents_dims.resize( ents_size, -1 );
423 [ + + ]: 18 : if( ent_or_set == iRel_ENTITY )
424 : : {
425 [ + - ]: 9 : int* ents_dims_ptr = &ents_dims[0];
426 : 9 : int ents_dims_alloc = ents_dims.size(), ents_dims_size;
427 : : result =
428 [ + - ]: 9 : ASSOCPAIRI->get_ents_dims( iface_no, ents, ents_size, &ents_dims_ptr, &ents_dims_alloc, &ents_dims_size );
429 : : }
430 : : else
431 : : {
432 : 9 : result = ASSOCPAIRI->get_dims( iface_no, sets, ents_size, &ents_dims[0] );
433 : : }
434 : :
435 [ - + ][ # # ]: 18 : if( iBase_SUCCESS != result && iBase_TAG_NOT_FOUND != result ) return result;
436 : :
437 : 18 : return iBase_SUCCESS;
438 : : }
439 : :
440 : 9 : static void iRel_inferArrArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ents1,
441 : : const int ents1_size, int ent_or_set1, iBase_EntityHandle* ents2,
442 : : const int ents2_size, int ent_or_set2, int* err )
443 : : {
444 : : int result;
445 : :
446 [ + - ][ + - ]: 18 : std::vector< int > ents_gids, ents_dims;
447 [ + - ][ + + ]: 90 : std::map< const int, iBase_EntityHandle > ents_gid_map[4];
[ + + ]
[ # # # # ]
448 : :
449 [ + - ]: 9 : get_gids_and_dims( pair, 0, ents1, ents1_size, ent_or_set1, ents_gids, ents_dims );
450 [ + + ]: 107 : for( int i = 0; i < ents1_size; i++ )
451 : : {
452 [ + - ]: 98 : int dim = ents_dims[i];
453 [ + - ][ + - ]: 98 : if( 0 <= dim && 3 >= dim ) ents_gid_map[dim][ents_gids[i]] = ents1[i];
[ + - ][ + - ]
454 : : }
455 : :
456 [ + - ]: 9 : get_gids_and_dims( pair, 1, ents2, ents2_size, ent_or_set2, ents_gids, ents_dims );
457 [ + + ]: 112 : for( int i = 0; i < ents2_size; i++ )
458 : : {
459 [ + - ]: 103 : int dim = ents_dims[i];
460 : :
461 : : // only check entities for which the dimension entry is in a reasonable
462 : : // range
463 [ + - ][ - + ]: 103 : if( 0 > dim || 3 < dim ) continue;
464 : :
465 : : // there's a match if there's an entity with that dimension with matching id
466 [ + - ][ + - ]: 103 : std::map< const int, iBase_EntityHandle >::iterator iter = ents_gid_map[dim].find( ents_gids[i] );
467 : :
468 : : // if it matches, set the relation tags for those entities
469 [ + - ][ + + ]: 103 : if( iter != ents_gid_map[dim].end() )
470 : : {
471 [ + - ][ - + ]: 75 : if( ent_or_set1 == iRel_ENTITY && ent_or_set2 == iRel_ENTITY )
472 [ # # ][ # # ]: 0 : { result = ASSOCPAIRI->set_relation( ( *iter ).second, ents2[i] ); }
473 [ - + ][ # # ]: 75 : else if( ent_or_set1 != iRel_ENTITY && ent_or_set2 == iRel_ENTITY )
474 : : {
475 [ # # ][ # # ]: 0 : result = ASSOCPAIRI->set_relation( ( iBase_EntitySetHandle )( *iter ).second, ents2[i] );
476 : : }
477 [ + - ][ + - ]: 75 : else if( ent_or_set1 == iRel_ENTITY && ent_or_set2 != iRel_ENTITY )
478 : : {
479 [ + - ][ + - ]: 75 : result = ASSOCPAIRI->set_relation( ( *iter ).second, (iBase_EntitySetHandle)ents2[i] );
480 : : }
481 : : else
482 : : { // ent_or_set1 != iRel_ENTITY && ent_or_set2 != iRel_ENTITY
483 [ # # ]: 0 : result = ASSOCPAIRI->set_relation( ( iBase_EntitySetHandle )( *iter ).second,
484 [ # # ]: 0 : (iBase_EntitySetHandle)ents2[i] );
485 : : }
486 : :
487 [ - + ]: 103 : CHK_ERROR( result );
488 : : }
489 : : }
490 : :
491 [ + - ][ # # ]: 18 : RETURN( iBase_SUCCESS );
492 : : }
493 : :
494 : 0 : void iRel_inferEntArrEntArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ents1,
495 : : const int ents1_size, iBase_EntityHandle* ents2, const int ents2_size, int* err )
496 : : {
497 : 0 : iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, 0, ents2, ents2_size, 0, err );
498 : 0 : }
499 : :
500 : 0 : void iRel_inferEntArrSetArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* ents1,
501 : : const int ents1_size, iBase_EntitySetHandle* ents2, const int ents2_size,
502 : : int* err )
503 : : {
504 : 0 : iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, 0, (iBase_EntityHandle*)ents2, ents2_size, 1, err );
505 : 0 : }
506 : :
507 : 0 : void iRel_inferSetArrEntArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* ents1,
508 : : const int ents1_size, iBase_EntityHandle* ents2, const int ents2_size, int* err )
509 : : {
510 : 0 : iRel_inferArrArrRelations( instance, pair, (iBase_EntityHandle*)ents1, ents1_size, 1, ents2, ents2_size, 0, err );
511 : 0 : }
512 : :
513 : 0 : void iRel_inferSetArrSetArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* ents1,
514 : : const int ents1_size, int /*is_set1*/, iBase_EntitySetHandle* ents2,
515 : : const int ents2_size, int /*is_set2*/, int* err )
516 : :
517 : : {
518 : : iRel_inferArrArrRelations( instance, pair, (iBase_EntityHandle*)ents1, ents1_size, 1, (iBase_EntityHandle*)ents2,
519 : 0 : ents2_size, 1, err );
520 : 0 : }
521 : :
522 : 3 : void iRel_inferAllRelations( iRel_Instance instance, iRel_PairHandle pair, int* err )
523 : : {
524 [ - + ][ # # ]: 6 : CHK_PAIR();
525 : :
526 : : // get all entities in those interfaces
527 : : int result;
528 : :
529 : 3 : iBase_EntityHandle* ents1 = NULL;
530 : 3 : int ents1_alloc = 0, ents1_size;
531 [ + - ][ - + ]: 3 : if( ASSOCPAIRI->relation_type( 0 ) != iRel_ENTITY )
532 [ # # ]: 0 : result = ASSOCPAIRI->get_all_sets( 0, (iBase_EntitySetHandle**)&ents1, &ents1_alloc, &ents1_size );
533 : : else
534 [ + - ][ - + ]: 3 : result = ASSOCPAIRI->get_all_entities( 0, -1, &ents1, &ents1_alloc, &ents1_size );CHK_ERROR( result );
535 : :
536 : 3 : iBase_EntityHandle* ents2 = NULL;
537 : 3 : int ents2_alloc = 0, ents2_size;
538 [ + - ][ + - ]: 3 : if( ASSOCPAIRI->relation_type( 1 ) != iRel_ENTITY )
539 [ + - ]: 3 : result = ASSOCPAIRI->get_all_sets( 1, (iBase_EntitySetHandle**)&ents2, &ents2_alloc, &ents2_size );
540 : : else
541 [ # # ][ - + ]: 3 : result = ASSOCPAIRI->get_all_entities( 1, -1, &ents2, &ents2_alloc, &ents2_size );CHK_ERROR( result );
542 : :
543 [ + - ]: 3 : iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, ASSOCPAIRI->relation_type( 0 ), ents2, ents2_size,
544 [ + - ][ + - ]: 6 : ASSOCPAIRI->relation_type( 1 ), &result );
545 : :
546 : 3 : free( ents1 );
547 [ - + ]: 3 : free( ents2 );CHK_ERROR( result );
548 : : }
549 : :
550 : 0 : void iRel_inferAllRelationsAndType( iRel_Instance instance, iRel_PairHandle* /*pair*/, int* err )
551 : : {
552 : 0 : ERROR( iBase_NOT_SUPPORTED, "Not currently supported." );
553 : : }
554 : :
555 : 0 : void iRel_inferEntRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle entity, int iface_no,
556 : : int* err )
557 : : {
558 : 0 : iRel_inferEntArrRelations( instance, pair, &entity, 1, iface_no, err );
559 : 0 : }
560 : :
561 : 0 : void iRel_inferSetRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle entity, int iface_no,
562 : : int* err )
563 : : {
564 : 0 : iRel_inferSetArrRelations( instance, pair, &entity, 1, iface_no, err );
565 : 0 : }
566 : :
567 : 6 : static void iRel_inferArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* entities,
568 : : int entities_size, bool is_set, int iface_no, int* err )
569 : : {
570 [ - + ][ # # ]: 12 : CHK_PAIR();
571 : :
572 [ + - ][ - + ]: 6 : if( 0 > iface_no || 1 < iface_no ) { ERROR( iBase_INVALID_ARGUMENT, "Interface number must be 0 or 1" ); }
[ # # ]
573 [ + + ][ + - ]: 9 : else if( ( is_set && ASSOCPAIRI->relation_type( iface_no ) == iRel_ENTITY ) ||
[ + - ][ + + ]
[ - + ]
574 [ + - ][ - + ]: 3 : ( !is_set && ASSOCPAIRI->relation_type( iface_no ) != iRel_ENTITY ) )
575 : : {
576 [ # # ]: 0 : ERROR( iBase_INVALID_ARGUMENT, "is_set must match entOrSet in call to "
577 : : "inferArrRelations" );
578 : : }
579 : :
580 : : // get all entities in iface2
581 : : int result;
582 : 6 : iBase_EntityHandle* ents1 = entities;
583 : 6 : int ents1_size = entities_size;
584 : 6 : iBase_EntityHandle* ents2 = NULL;
585 : 6 : int ents2_alloc = 0, ents2_size;
586 [ + - ][ + + ]: 6 : if( ASSOCPAIRI->relation_type( 1 - iface_no ) != iRel_ENTITY )
587 [ + - ]: 3 : result = ASSOCPAIRI->get_all_sets( !iface_no, (iBase_EntitySetHandle**)&ents2, &ents2_alloc, &ents2_size );
588 : : else
589 [ + - ][ - + ]: 6 : result = ASSOCPAIRI->get_all_entities( !iface_no, -1, &ents2, &ents2_alloc, &ents2_size );CHK_ERROR( result );
590 : :
591 : : // switch so that entity lists always go into inferArrArrRelations in
592 : : // forward order wrt pair
593 [ + + ]: 6 : if( 1 == iface_no )
594 : : {
595 : 3 : std::swap( ents1, ents2 );
596 : 3 : std::swap( ents1_size, ents2_size );
597 : : }
598 : :
599 [ + - ]: 6 : iRel_inferArrArrRelations( instance, pair, ents1, ents1_size, ASSOCPAIRI->relation_type( 0 ), ents2, ents2_size,
600 [ + - ][ + - ]: 12 : ASSOCPAIRI->relation_type( 1 ), &result );
601 : :
602 [ + + ]: 6 : free( 1 == iface_no ? ents1 : ents2 );
603 : :
604 [ - + ]: 6 : CHK_ERROR( result );
605 : : }
606 : :
607 : 3 : void iRel_inferEntArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntityHandle* entities,
608 : : int entities_size, int iface_no, int* err )
609 : : {
610 : 3 : iRel_inferArrRelations( instance, pair, entities, entities_size, false, iface_no, err );
611 : 3 : }
612 : :
613 : 3 : void iRel_inferSetArrRelations( iRel_Instance instance, iRel_PairHandle pair, iBase_EntitySetHandle* entities,
614 : : int entities_size, int iface_no, int* err )
615 : : {
616 : 3 : iRel_inferArrRelations( instance, pair, (iBase_EntityHandle*)entities, entities_size, true, iface_no, err );
617 [ + - ][ + - ]: 20 : }
|