LCOV - code coverage report
Current view: top level - algs/AdvFront - AF2Binding.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 79 89 88.8 %
Date: 2020-07-01 15:24:36 Functions: 10 10 100.0 %
Branches: 94 192 49.0 %

           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 : }

Generated by: LCOV version 1.11