bool operator<(const Arc &arc1, const Arc &arc2) {
     if (arc1.first() != arc2.first()) {
         return arc1.first() < arc2.first();
     }
     if (IS_EMPTY(arc1.second())) {
         if (IS_EMPTY(arc2.second())) {
             return LESS_EMPTY_EMPTY(arc1.second(), arc2.second());
         }
         else {
             return LESS_EMPTY_SOLID(arc1.second(), arc2.second());
         }
     }
     else {
         if (IS_EMPTY(arc2.second())) {
             return LESS_SOLID_EMPTY(arc1.second(), arc2.second());
         }
         else {
             return LESS_SOLID_SOLID(arc1.second(), arc2.second());
         }
     }
 }
 bool compareArc(const Arc &arc1, const Arc &arc2) {
     if (DECODE_EMPTY_POS(arc1.second()) != DECODE_EMPTY_POS(arc2.second())) {
         return DECODE_EMPTY_POS(arc1.second()) < DECODE_EMPTY_POS(arc2.second());
     }
     if (ARC_LEFT(arc1.first(), arc1.second())) {
         if (ARC_RIGHT(arc2.first(), arc2.second())) {
             return false;
         }
         else {
             return arc1.first() > arc2.first();
         }
     }
     else {
         if (ARC_LEFT(arc2.first(), arc2.second())) {
             return true;
         }
         else {
             return arc1.first() > arc2.first();
         }
     }
 }
 Size HashFunc<Arc>::operator()(const Arc &key) const {
   pair.first = key.first();
   pair.second = key.second();
   return HashFuncSmallKeyPair<NodeId, NodeId>::operator()(pair);
 }
 bool operator<(const Arc &arc1, const Arc &arc2) {
     if (arc1.first() != arc2.first()) {
         return arc1.first() < arc2.first();
     }
     return arc1.second() < arc2.second();
 }