// Cutmesh - Copyright (C) 2010-2018 T. Mouton, E. Bechet 
//
// See the LICENSE file for license information and contributions.
// bugs and problems to <thibaud.mouton@gmail.com>.

#include "brep.h"

void BRepModel::map_insert ( BRepEntity* be )
{
  int key = 0;
  for ( int i = 0; i < be->surf_size(); i++ )
    key += be->get_surf ( i );
  _occurence.insert ( std::pair<int, BRepEntity*> ( key, be ) );
}

void BRepModel::map_remove ( BRepEntity* be )
{
  int key = 0;
  for ( int i = 0; i < be->surf_size(); i++ )
    key += be->get_surf ( i );
  std::multimap<int, BRepEntity*>::iterator it;
  std::pair<std::multimap<int, BRepEntity*>::iterator, std::multimap<int, BRepEntity*>::iterator> ret;
  ret = _occurence.equal_range ( key );
  for ( it=ret.first; it!=ret.second; ++it )
    if ( it->second == be )
    {
      _occurence.erase ( it );
      return;
    }
  assert ( 0 );
}


void BRepModel::query ( BRepEntity* be, std::vector<BRepEntity*> &result )
{
  int key = 0;
  for ( int i = 0; i < be->surf_size(); i++ )
    key += be->get_surf ( i );
  std::multimap<int, BRepEntity*>::iterator it;
  std::pair<std::multimap<int, BRepEntity*>::iterator, std::multimap<int, BRepEntity*>::iterator> ret;
  ret = _occurence.equal_range ( key );
  for ( it=ret.first; it!=ret.second; ++it )
  {
    if ( it->second->equal ( be ) )
      result.push_back ( it->second );
  }
}

void BRepModel::query ( std::vector<int> surf, std::vector<BRepEntity*> &result )
{
  int key = 0;
  for ( int i = 0; i < surf.size(); i++ )
    key += surf[i];
  std::multimap<int, BRepEntity*>::iterator it;
  std::pair<std::multimap<int, BRepEntity*>::iterator, std::multimap<int, BRepEntity*>::iterator> ret;
  ret = _occurence.equal_range ( key );
  for ( it=ret.first; it!=ret.second; ++it )
  {
    if ( it->second->equal ( surf ) )
      result.push_back ( it->second );
  }
}

void BRepModel::set_associated ( BRepEntity* be )
{
  int key = 0;
  for ( int i = 0; i < be->surf_size(); i++ )
    key += be->get_surf ( i );
  std::multimap<int, BRepEntity*>::iterator it;
  std::pair<std::multimap<int, BRepEntity*>::iterator, std::multimap<int, BRepEntity*>::iterator> ret;
  ret = _occurence.equal_range ( key );
  for ( it=ret.first; it!=ret.second; ++it )
  {
    if ( it->second->equal ( be ) )
    {
      _occurence.erase ( it );
      return;
    }
  }
}
