void OBStereo::Permutate(OBStereo::Refs &refs, int i, int j)
 {
   if (i < 0 || i >= refs.size())
     return;
   if (j < 0 || j >= refs.size())
     return;
   unsigned long id = refs.at(i);
   refs[i] = refs.at(j);
   refs[j] = id;
 }
bool hasSameWinding(const OBStereo::Refs &refs1, const OBStereo::Refs &refs2)
{
  OB_REQUIRE( refs1.size() == 3 );
  OB_REQUIRE( refs2.size() == 3 );

  int Ni1 = OBStereo::NumInversions(refs1);
  int Ni2 = OBStereo::NumInversions(refs2);

  return ((Ni1 + Ni2) % 2 == 0);
}
 OBStereo::Refs OBStereo::Permutated(const OBStereo::Refs &refs, int i, int j)
 {
   if (i < 0 || i >= refs.size())
     return refs;
   if (j < 0 || j >= refs.size())
     return refs;
   OBStereo::Refs result(refs);
   result[i] = refs.at(j);
   result[j] = refs.at(i);
   return result;
 }
  bool OBStereo::ContainsSameRefs(const OBStereo::Refs &refs1, const OBStereo::Refs &refs2)
  {
    if (refs1.size() != refs2.size())
      return false;

    int count = 0;
    for (ConstRefIter i = refs1.begin(); i != refs1.end(); ++i)
      for (ConstRefIter j = refs2.begin(); j != refs2.end(); ++j)
        if (*i == *j) {
          count++;
          break;
        }

    return (count == refs1.size());
  }