Branch data Line data Source code
1 : : #include "meshkit/AF2Binding.hpp"
2 : : #include "meshkit/Error.hpp"
3 : :
4 : : typedef std::map<const AF2RuleExistEdge*,
5 : : const AF2Edge2D*>::iterator EdgeBindMapItr;
6 : : typedef std::map<const AF2RuleExistEdge*,
7 : : const AF2Edge2D*>::const_iterator EdgeBindMapConstItr;
8 : :
9 : 169482 : AF2Binding::VtxBindRec::VtxBindRec() :
10 : 169482 : pointPtr(NULL), numBoundEdges(0), xplctBound(false)
11 : : {
12 : : // do nothing beyond the initializers
13 : 169482 : }
14 : :
15 : 90986 : void AF2Binding::bind(
16 : : const AF2RuleExistEdge* ruleEdgePtr, const AF2Edge2D* ngbhdEdgePtr)
17 : : {
18 [ + - ]: 90986 : EdgeBindMapItr itr = edgeBindMap.find(ruleEdgePtr);
19 [ + - ][ + - ]: 90986 : if (itr == edgeBindMap.end())
20 : : {
21 : : // the rule edge is not bound to anything
22 [ + - ][ + - ]: 272958 : if (edgesInUse.find(ngbhdEdgePtr) == edgesInUse.end() &&
[ + - ][ + - ]
[ + - ][ + -
# # # # ]
23 [ + - ][ + - ]: 181972 : isConsistent(ruleEdgePtr->getStart(), ngbhdEdgePtr->getStart()) &&
[ + - ][ + - ]
[ + - ]
24 [ + - ][ + - ]: 90986 : isConsistent(ruleEdgePtr->getEnd(), ngbhdEdgePtr->getEnd()))
[ + - ]
25 : : {
26 : : // nothing else is bound to the neighborhood edge
27 : : // and binding the endpoints of the edge is consistent, so . . .
28 : : // . . . bind the endpoints of the edge,
29 [ + - ][ + - ]: 90986 : bind(ruleEdgePtr->getStart(), ngbhdEdgePtr->getStart(), false);
[ + - ]
30 [ + - ][ + - ]: 90986 : bind(ruleEdgePtr->getEnd(), ngbhdEdgePtr->getEnd(), false);
[ + - ]
31 : : // . . . bind the edge itself,
32 [ + - ]: 90986 : edgeBindMap[ruleEdgePtr] = ngbhdEdgePtr;
33 : : // . . . and mark the edge as being in use
34 [ + - ]: 90986 : edgesInUse.insert(ngbhdEdgePtr);
35 : : }
36 : : else
37 : : {
38 : : // something else is bound to the neighborhood edge already or there
39 : : // is an inconsistency in binding one or more of the endpoints
40 [ # # ]: 0 : throw MeshKit::Error(MeshKit::MK_BAD_INPUT, "Binding the rule edge to the neighborhood edge is inconsistent with existing bindings.");
41 : : }
42 : : }
43 : : else
44 : : {
45 [ # # ][ # # ]: 0 : if (itr->second == ngbhdEdgePtr)
46 : : {
47 : : // the rule edge is already bound to the neighborhood edge
48 : : // this should imply that the endpoints of the rule edge are implicitly
49 : : // bound to the endpoints of the neighborhood edge
50 : :
51 : : // There is nothing to do in this case.
52 : : }
53 : : else
54 : : {
55 : : // the rule edge is bound to some other neighborhood edge
56 : : throw MeshKit::Error(MeshKit::MK_BAD_INPUT,
57 [ # # ]: 0 : "The rule edge is already bound to some other neighborhood edge.");
58 : : }
59 : : }
60 : 90986 : }
61 : :
62 : 3366 : void AF2Binding::bind(
63 : : const AF2RuleExistVertex* ruleVertexPtr, const AF2Point2D* ngbhdVertexPtr)
64 : : {
65 : 3366 : bind(ruleVertexPtr, ngbhdVertexPtr, true);
66 : 3366 : }
67 : :
68 : 185338 : void AF2Binding::bind(const AF2RuleExistVertex* ruleVertexPtr,
69 : : const AF2Point2D* ngbhdVertexPtr, bool isExplicit)
70 : : {
71 : : typedef std::map<const AF2RuleExistVertex*,
72 : : AF2Binding::VtxBindRec>::iterator VertexBindMapItr;
73 [ + - ]: 185338 : VertexBindMapItr itr = vertexBindMap.find(ruleVertexPtr);
74 [ + - ][ + + ]: 185338 : if (itr == vertexBindMap.end())
75 : : {
76 : : // the rule vertex was not previously bound
77 [ + - ][ + - ]: 169482 : if (verticesInUse.find(ngbhdVertexPtr) == verticesInUse.end())
[ + - ]
78 : : {
79 : : // nothing else was bound to the neighborhood vertex
80 : : // insert the binding from the rule vertex to the neighborhood vertex
81 [ + - ]: 169482 : VtxBindRec* bindRecordPtr = &(vertexBindMap[ruleVertexPtr]);
82 : 169482 : bindRecordPtr->pointPtr = ngbhdVertexPtr;
83 [ + + ]: 169482 : if (isExplicit)
84 : : {
85 : 3366 : bindRecordPtr->xplctBound = true;
86 : : }
87 : : else
88 : : {
89 : 166116 : bindRecordPtr->numBoundEdges = 1;
90 : : }
91 : : // mark the neighborhood vertex as being in use
92 [ + - ]: 169482 : verticesInUse.insert(ngbhdVertexPtr);
93 : : }
94 : : else
95 : : {
96 : : // something else is bound to the neighborhood vertex already
97 [ # # ]: 169482 : throw MeshKit::Error(MeshKit::MK_BAD_INPUT, "Some other rule vertex is already bound to the neighborhood vertex.");
98 : : }
99 : : }
100 : : else
101 : : {
102 [ + - ]: 15856 : VtxBindRec* bindRecordPtr = &(itr->second);
103 [ + - ]: 15856 : if (bindRecordPtr->pointPtr == ngbhdVertexPtr)
104 : : {
105 : : // the rule vertex is already bound to the correct neighborhood vertex
106 [ - + ]: 15856 : if (isExplicit)
107 : : {
108 : 0 : bindRecordPtr->xplctBound = true;
109 : : }
110 : : else
111 : : {
112 : 15856 : ++(bindRecordPtr->numBoundEdges);
113 : : }
114 : : }
115 : : else
116 : : {
117 : : // the rule vertex is already bound to some other neighborhood vertex
118 [ # # ]: 0 : throw MeshKit::Error(MeshKit::MK_BAD_INPUT, "The rule vertex is already bound to some other neighborhood vertex.");
119 : : }
120 : : }
121 : 185338 : }
122 : :
123 : 214483 : const AF2Point2D* AF2Binding::getBoundValue(
124 : : const AF2RuleExistVertex* ruleVertexPtr) const
125 : : {
126 : : typedef std::map<const AF2RuleExistVertex*,
127 : : AF2Binding::VtxBindRec>::const_iterator VertexBindMapConstItr;
128 [ + - ]: 214483 : VertexBindMapConstItr itr = vertexBindMap.find(ruleVertexPtr);
129 [ + - ][ + + ]: 214483 : if (itr == vertexBindMap.end())
130 : : {
131 : : // the rule vertex is not bound to anything
132 : 1 : return NULL;
133 : : }
134 : : else
135 : : {
136 [ + - ]: 214483 : return itr->second.pointPtr;
137 : : }
138 : : }
139 : :
140 : 94817 : bool AF2Binding::isConsistent(
141 : : const AF2RuleExistEdge* ruleEdgePtr, const AF2Edge2D* ngbhdEdgePtr) const
142 : : {
143 [ + - ]: 94817 : EdgeBindMapConstItr itr = edgeBindMap.find(ruleEdgePtr);
144 [ + - ][ + - ]: 94817 : if (itr == edgeBindMap.end())
145 : : {
146 : : // the rule edge is not bound to anything
147 [ + - ][ + - ]: 94817 : if (edgesInUse.find(ngbhdEdgePtr) == edgesInUse.end())
[ + + ]
148 : : {
149 : : // nothing else is bound to the neighborhood edge
150 : : // check consistency of the endpoints of the edge
151 [ + - ][ + - ]: 94001 : return isConsistent(ruleEdgePtr->getStart(), ngbhdEdgePtr->getStart())
[ + - ]
152 [ + + ][ + - ]: 94001 : && isConsistent(ruleEdgePtr->getEnd(), ngbhdEdgePtr->getEnd());
[ + - ][ + - ]
[ + + ]
153 : : }
154 : : else
155 : : {
156 : : // something else is bound to the neighborhood edge already
157 : 816 : return false;
158 : : }
159 : : }
160 : : else
161 : : {
162 [ # # ][ # # ]: 0 : if (itr->second == ngbhdEdgePtr)
163 : : {
164 : : // the rule edge is already bound to the neighborhood edge
165 : : // this should imply that the endpoints of the rule edge are
166 : : // bound to the endpoints of the neighborhood edge
167 : 0 : return true;
168 : : }
169 : : else
170 : : {
171 : : // the rule edge is bound to some other neighborhood edge
172 : 94817 : return false;
173 : : }
174 : : }
175 : : }
176 : :
177 : 370766 : bool AF2Binding::isConsistent(const AF2RuleExistVertex* ruleVertexPtr,
178 : : const AF2Point2D* ngbhdVertexPtr) const
179 : : {
180 : : typedef std::map<const AF2RuleExistVertex*,
181 : : AF2Binding::VtxBindRec>::const_iterator VertexBindMapConstItr;
182 [ + - ]: 370766 : VertexBindMapConstItr itr = vertexBindMap.find(ruleVertexPtr);
183 [ + - ][ + + ]: 370766 : if (itr == vertexBindMap.end())
184 : : {
185 : : // the rule vertex is not bound to anything
186 [ + - ][ + - ]: 335994 : if (verticesInUse.find(ngbhdVertexPtr) == verticesInUse.end())
[ + + ]
187 : : {
188 : : // nothing else is bound to the neighborhood vertex
189 : 335829 : return true;
190 : : }
191 : : else
192 : : {
193 : : // something else is bound to the neighborhood vertex already
194 : 165 : return false;
195 : : }
196 : : }
197 : : else
198 : : {
199 [ + - ]: 34772 : const VtxBindRec* bindRecordPtr = &(itr->second);
200 [ + + ]: 34772 : if (bindRecordPtr->pointPtr == ngbhdVertexPtr)
201 : : {
202 : : // the rule vertex is already bound to the neighborhood vertex
203 : 31922 : return true;
204 : : }
205 : : else
206 : : {
207 : : // the rule vertex is bound to some other neighborhood vertex
208 : 370766 : return false;
209 : : }
210 : : }
211 : : }
212 : :
213 : 90986 : void AF2Binding::release(const AF2RuleExistEdge* ruleEdgePtr)
214 : : {
215 [ + - ]: 90986 : EdgeBindMapItr itr = edgeBindMap.find(ruleEdgePtr);
216 [ + - ][ - + ]: 90986 : if (itr == edgeBindMap.end())
217 : : {
218 : : // the rule edge is not bound to anything
219 : : throw MeshKit::Error(MeshKit::MK_BAD_INPUT,
220 [ # # ]: 0 : "The rule edge is not bound to any neighborhood edge.");
221 : : }
222 : : else
223 : : {
224 [ + - ][ + - ]: 90986 : edgesInUse.erase(itr->second);
225 [ + - ]: 90986 : edgeBindMap.erase(itr);
226 [ + - ][ + - ]: 90986 : release(ruleEdgePtr->getEnd(), false);
227 [ + - ][ + - ]: 90986 : release(ruleEdgePtr->getStart(), false);
228 : : }
229 : 90986 : }
230 : :
231 : 3361 : void AF2Binding::release(const AF2RuleExistVertex* ruleVertexPtr)
232 : : {
233 : 3361 : release(ruleVertexPtr, true);
234 : 3361 : }
235 : :
236 : 185333 : void AF2Binding::release(
237 : : const AF2RuleExistVertex* ruleVertexPtr, bool isExplicit)
238 : : {
239 : : typedef std::map<const AF2RuleExistVertex*,
240 : : AF2Binding::VtxBindRec>::iterator VertexBindMapItr;
241 [ + - ]: 185333 : VertexBindMapItr itr = vertexBindMap.find(ruleVertexPtr);
242 [ + - ][ - + ]: 185333 : if (itr == vertexBindMap.end())
243 : : {
244 : : // the rule vertex is not bound to anything
245 : : throw MeshKit::Error(MeshKit::MK_BAD_INPUT,
246 [ # # ]: 0 : "The rule vertex is not bound to any neighborhood vertex.");
247 : : }
248 : : else
249 : : {
250 [ + - ]: 185333 : VtxBindRec* bindRecordPtr = &(itr->second);
251 [ + + ]: 185333 : if (isExplicit)
252 : : {
253 [ - + ]: 3361 : if (!bindRecordPtr->xplctBound)
254 : : {
255 [ # # ]: 0 : throw MeshKit::Error(MeshKit::MK_BAD_INPUT, "The rule vertex is not explicitly bound to a neighborhood vertex. The binding is implicit. Release the edge(s) instead.");
256 : : }
257 : 3361 : bindRecordPtr->xplctBound = false;
258 : : }
259 : : else
260 : : {
261 : 181972 : --(bindRecordPtr->numBoundEdges);
262 : : }
263 : :
264 [ + - ][ + + ]: 185333 : if (!(bindRecordPtr->xplctBound) && bindRecordPtr->numBoundEdges == 0)
265 : : {
266 : : // after performing the requested release operation, the vertex
267 : : // is no longer bound either explicitly or implicitly
268 [ + - ]: 169477 : verticesInUse.erase(bindRecordPtr->pointPtr);
269 [ + - ]: 169477 : vertexBindMap.erase(itr);
270 : : }
271 : : }
272 : 185333 : }
|