void mesh_no_id(const char* argv1)
{
  typedef boost::graph_traits<Mesh>::face_descriptor face_descriptor;

  Mesh sm;
  std::ifstream in(argv1);
  in >> sm;

  
  std::vector<face_descriptor> cc;
  face_descriptor fd = *faces(sm).first;
  PMP::connected_component(fd,
                           sm,
                           std::back_inserter(cc));


  std::cerr << cc.size() << " faces in the CC of " << &*fd << std::endl;
  boost::property_map<Mesh,boost::vertex_external_index_t>::type vim 
    = get(boost::vertex_external_index,sm);

  boost::property_map<Mesh,boost::face_external_index_t>::type fim 
    = get(boost::face_external_index,sm);

  boost::vector_property_map<int,
    boost::property_map<Mesh, boost::face_external_index_t>::type>
      fccmap(fim);

  std::size_t num = PMP::connected_components(sm,
    fccmap,
    PMP::parameters::face_index_map(fim));
  
  std::cerr << "The graph has " << num << " connected components (face connectivity)" << std::endl;
  //BOOST_FOREACH(face_descriptor f , faces(sm)){
  //  std::cout  << &*f << " in connected component " << fccmap[f] << std::endl;
  //}

  PMP::keep_largest_connected_components(sm
    , 2
    , PMP::parameters::vertex_index_map(vim).
      face_index_map(fim));

  std::ofstream ofile("blobby_2cc_no_id.off");
  ofile << sm << std::endl;
  ofile.close();
}
void test_border_cases()
{
  std::cerr <<"Testing border cases\n";
  typedef boost::graph_traits<Mesh_with_id>::face_descriptor face_descriptor;
  typedef boost::graph_traits<Mesh_with_id>::vertex_descriptor vertex_descriptor;

  std::ifstream input("data/elephant.off");
  Mesh_with_id sm;
  input >> sm;

  std::size_t i=0;
  BOOST_FOREACH(face_descriptor f, faces(sm))
    f->id() = i++;
  i=0;
  BOOST_FOREACH(vertex_descriptor v, vertices(sm))
    v->id() = i++;

  boost::vector_property_map<int,
    boost::property_map<Mesh_with_id, boost::face_index_t>::type>
      fccmap(get(boost::face_index,sm));

  PMP::connected_components(sm, fccmap);
  std::size_t nb_faces=num_faces(sm);

  std::cerr <<" removing no faces\n";
  PMP::remove_connected_components(sm, std::vector<std::size_t>(), fccmap);
  assert( nb_faces == num_faces(sm) );

  std::cerr <<" removing all faces\n";
  Mesh_with_id copy = sm;
  PMP::connected_components(sm, fccmap);
  PMP::remove_connected_components(copy, std::vector<std::size_t>(1,0), fccmap);
  assert(num_vertices(copy)==0);

  std::cerr <<" keeping all faces\n";
  PMP::connected_components(sm, fccmap);
  PMP::keep_connected_components(sm, std::vector<face_descriptor>(1, *faces(sm).first));
  assert( nb_faces == num_faces(sm) );

  std::cerr <<" keeping no faces\n";
  copy = sm;
  PMP::connected_components(sm, fccmap);
  PMP::keep_connected_components(copy, std::vector<face_descriptor>());
  assert(num_vertices(copy)==0);
}
void mesh_with_id(const char* argv1)
{
  typedef boost::graph_traits<Mesh_with_id>::vertex_descriptor vertex_descriptor;
  typedef boost::graph_traits<Mesh_with_id>::face_descriptor face_descriptor;

  Mesh_with_id sm;
  std::ifstream in(argv1);
  in >> sm;

  int i=0;
  BOOST_FOREACH(face_descriptor f, faces(sm)){
    f->id() = i++;
  } 
  i=0;
  BOOST_FOREACH(vertex_descriptor v, vertices(sm)){
    v->id() = i++;
  }

  std::vector<face_descriptor> cc;
  face_descriptor fd = *faces(sm).first;
  PMP::connected_component(fd,
                           sm,
                           std::back_inserter(cc));

  std::cerr << cc.size() << " faces in the CC of " << &*fd << std::endl;

  boost::vector_property_map<int,
    boost::property_map<Mesh_with_id, boost::face_index_t>::type>
      fccmap(get(boost::face_index,sm));

  std::size_t num = PMP::connected_components(sm,
                                              fccmap);
  
  std::cerr << "The graph has " << num << " connected components (face connectivity)" << std::endl;

  PMP::keep_largest_connected_components(sm,2);

 std::ofstream ofile("blobby_2cc_id.off");
 ofile << sm << std::endl;
 ofile.close();
}