mirror of https://github.com/CGAL/cgal
332 lines
10 KiB
C++
332 lines
10 KiB
C++
// Copyright (c) 2013 CNRS and LIRIS' Establishments (France). All rights reserved.
|
|
//
|
|
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public License as
|
|
// published by the Free Software Foundation; either version 3 of the License,
|
|
// or (at your option) any later version.
|
|
//
|
|
// Licensees holding a valid commercial license may use this file in
|
|
// accordance with the commercial license agreement provided with the software.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// $URL$
|
|
// $Id$
|
|
//
|
|
// Author(s) : Pierre Talbot
|
|
|
|
#ifndef CGAL_BOOST_GRAPH_GRAPH_TRAITS_CMAP_H
|
|
#define CGAL_BOOST_GRAPH_GRAPH_TRAITS_CMAP_H
|
|
|
|
#include <utility>
|
|
#include <iterator>
|
|
|
|
#include <boost/config.hpp>
|
|
#include <boost/graph/graph_traits.hpp>
|
|
#include <boost/graph/properties.hpp>
|
|
|
|
#include <CGAL/Combinatorial_map.h>
|
|
#include <CGAL/Dart_iterators.h>
|
|
|
|
#define CMAP_BASE_TEMPLATE_ARGS template<unsigned int d, class Refs, class Items, class Alloc>
|
|
#define CMAP_BASE_TYPE CGAL::Combinatorial_map_base<d, Refs, Items, Alloc>
|
|
|
|
#define CMAP_TEMPLATE_ARGS template<unsigned int d, class Items, class Alloc>
|
|
#define CMAP_TYPE CGAL::Combinatorial_map<d, Items, Alloc>
|
|
|
|
#define LCC_TEMPLATE_ARGS template < unsigned int d_, unsigned int ambient_dim, \
|
|
class Traits_, \
|
|
class Items_, \
|
|
class Alloc_, \
|
|
template<unsigned int, class,class,class>\
|
|
class CMap>
|
|
|
|
#define LCC_TYPE CGAL::Linear_cell_complex<d_, ambient_dim, Traits_, Items_, Alloc_, CMap>
|
|
|
|
namespace CGAL {
|
|
|
|
|
|
template <class CMap, typename Dart_Iterator>
|
|
class CMap_dart_handle_iterator
|
|
{
|
|
public:
|
|
typedef Dart_Iterator Iterator;
|
|
|
|
typedef typename CMap::Dart_handle Dart_handle;
|
|
|
|
typedef CMap_dart_handle_iterator<CMap, Dart_Iterator> Self;
|
|
|
|
typedef typename std::iterator_traits<Iterator>::iterator_category iterator_category;
|
|
typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
|
|
typedef Dart_handle value_type;
|
|
typedef value_type reference;
|
|
typedef value_type pointer;
|
|
|
|
public:
|
|
|
|
// OPERATIONS Forward Category
|
|
// ---------------------------
|
|
|
|
bool operator==( const Self& i) const { return ( nt == i.nt); }
|
|
bool operator!=( const Self& i) const { return !(nt == i.nt );}
|
|
value_type operator*() const { return nt; }
|
|
value_type operator->() { return nt; }
|
|
|
|
Self& operator++() {
|
|
++nt;
|
|
return *this;
|
|
}
|
|
|
|
Self operator++(int) {
|
|
Self tmp = *this;
|
|
++*this;
|
|
return tmp;
|
|
}
|
|
|
|
CMap_dart_handle_iterator(Iterator iter):
|
|
nt(iter)
|
|
{}
|
|
|
|
// Default constructor
|
|
CMap_dart_handle_iterator():
|
|
nt(get_default(), Dart_handle())
|
|
{}
|
|
|
|
CMap_dart_handle_iterator(const CMap_dart_handle_iterator& it)
|
|
: nt(it.nt)
|
|
{}
|
|
|
|
CMap_dart_handle_iterator& operator=(const CMap_dart_handle_iterator& it)
|
|
{
|
|
nt = const_cast<CMap_dart_handle_iterator&>(it).nt;
|
|
}
|
|
|
|
private:
|
|
Iterator nt;
|
|
static CMap& get_default()
|
|
{
|
|
static CMap* m = new CMap();
|
|
return *m;
|
|
}
|
|
};
|
|
|
|
template <typename Dart_handle>
|
|
struct EdgeHandle : Dart_handle
|
|
{
|
|
EdgeHandle() : Dart_handle(NULL){}
|
|
EdgeHandle(const Dart_handle& h): Dart_handle(h)
|
|
{}
|
|
};
|
|
|
|
template <class CMap>
|
|
struct CMap_Base_graph_traits
|
|
{
|
|
|
|
public :
|
|
struct CMap_graph_traversal_category : public virtual boost::bidirectional_graph_tag,
|
|
public virtual boost::vertex_list_graph_tag,
|
|
public virtual boost::edge_list_graph_tag
|
|
{};
|
|
|
|
// Expose types required by the boost::Graph concept.
|
|
typedef typename CMap::Dart_handle vertex_descriptor;
|
|
typedef EdgeHandle<typename CMap::Dart_handle> edge_descriptor;
|
|
typedef boost::directed_tag directed_category;
|
|
typedef boost::allow_parallel_edge_tag edge_parallel_category;
|
|
typedef CMap_graph_traversal_category traversal_category;
|
|
|
|
// Expose types required by the boost::IncidenceGraph concept.
|
|
typedef CMap_dart_handle_iterator<CMap, CMap_dart_iterator_of_cell<CMap, 0> > out_edge_iterator;
|
|
typedef typename CMap::size_type degree_size_type;
|
|
|
|
// Expose types required by the boost::BidirectionalGraph concept.
|
|
typedef CMap_dart_handle_iterator<CMap, CMap_dart_iterator_of_second_vertex<CMap> > in_edge_iterator;
|
|
typedef typename CMap::size_type edges_size_type;
|
|
|
|
// Expose types required by the boost::EdgeListGraph concept.
|
|
typedef CMap_dart_handle_iterator<CMap, typename CMap::Dart_range::iterator> edge_iterator;
|
|
|
|
// Expose types required by the boost::VertexListGraph concept.
|
|
typedef typename CMap::size_type vertices_size_type;
|
|
typedef CMap_dart_handle_iterator<CMap, typename CMap::template One_dart_per_cell_range<0>::iterator> vertex_iterator;
|
|
};
|
|
|
|
} //namespace CGAL
|
|
|
|
namespace boost{
|
|
|
|
// Specialization of graph_traits for Combinatorial map.
|
|
CMAP_TEMPLATE_ARGS
|
|
struct graph_traits<CMAP_TYPE >
|
|
: CGAL::CMap_Base_graph_traits<typename CMAP_TYPE::Base >
|
|
{};
|
|
|
|
CMAP_TEMPLATE_ARGS
|
|
struct graph_traits<CMAP_TYPE const>
|
|
: CGAL::CMap_Base_graph_traits<typename CMAP_TYPE::Base >
|
|
{};
|
|
|
|
// Specialization of graph_traits for Combinatorial map base.
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
struct graph_traits<CMAP_BASE_TYPE >
|
|
: CGAL::CMap_Base_graph_traits<CMAP_BASE_TYPE >
|
|
{};
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
struct graph_traits<CMAP_BASE_TYPE const>
|
|
: CGAL::CMap_Base_graph_traits<CMAP_BASE_TYPE >
|
|
{};
|
|
|
|
// Specialization of graph_traits for Linear Cell Complex.
|
|
LCC_TEMPLATE_ARGS
|
|
struct graph_traits<LCC_TYPE >
|
|
: CGAL::CMap_Base_graph_traits<typename LCC_TYPE::Base >
|
|
{};
|
|
|
|
LCC_TEMPLATE_ARGS
|
|
struct graph_traits<LCC_TYPE const>
|
|
: CGAL::CMap_Base_graph_traits<typename LCC_TYPE::Base >
|
|
{};
|
|
|
|
// Expression required by the boost::IncidenceGraph concept.
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_descriptor
|
|
source(typename boost::graph_traits<CMAP_BASE_TYPE >::edge_descriptor e, const CMAP_BASE_TYPE&)
|
|
{
|
|
return e;
|
|
}
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_descriptor
|
|
target(typename boost::graph_traits<CMAP_BASE_TYPE >::edge_descriptor e, const CMAP_BASE_TYPE&)
|
|
{
|
|
return e->opposite();
|
|
}
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
std::pair<typename boost::graph_traits<CMAP_BASE_TYPE >::out_edge_iterator,
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::out_edge_iterator>
|
|
out_edges(typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_descriptor u, const CMAP_BASE_TYPE& cm)
|
|
{
|
|
typedef typename boost::graph_traits<CMAP_BASE_TYPE >::out_edge_iterator iter_type;
|
|
|
|
CMAP_BASE_TYPE& cmap = const_cast<CMAP_BASE_TYPE&>(cm);
|
|
|
|
return std::make_pair(
|
|
cmap.template darts_of_cell<0>(u).begin(),
|
|
cmap.template darts_of_cell<0>(u).end());
|
|
}
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::degree_size_type
|
|
out_degree(typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_descriptor u, const CMAP_BASE_TYPE& cm)
|
|
{
|
|
typedef typename boost::graph_traits<CMAP_BASE_TYPE >::out_edge_iterator iter_type;
|
|
std::pair<iter_type, iter_type> iter = out_edges(u, cm);
|
|
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::degree_size_type degree=0;
|
|
for(;iter.first != iter.second; ++(iter.first))
|
|
++degree;
|
|
return degree;
|
|
}
|
|
|
|
// Expression required by the boost::BidirectionalGraph concept.
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
std::pair<typename boost::graph_traits<CMAP_BASE_TYPE >::in_edge_iterator, typename boost::graph_traits<CMAP_BASE_TYPE >::in_edge_iterator>
|
|
in_edges(typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_descriptor v, const CMAP_BASE_TYPE& cm)
|
|
{
|
|
typedef typename boost::graph_traits<CMAP_BASE_TYPE >::in_edge_iterator iter_type;
|
|
|
|
CMAP_BASE_TYPE& cmap = const_cast<CMAP_BASE_TYPE&>(cm);
|
|
|
|
return std::make_pair<iter_type, iter_type>
|
|
(cmap.darts_of_second_vertex(v).begin(), cmap.darts_of_second_vertex(v).end());
|
|
}
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::degree_size_type
|
|
in_degree(typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_descriptor v, const CMAP_BASE_TYPE& cm)
|
|
{
|
|
typedef typename boost::graph_traits<CMAP_BASE_TYPE >::in_edge_iterator iter_type;
|
|
std::pair<iter_type, iter_type> iter = in_edges(v, cm);
|
|
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::degree_size_type degree=0;
|
|
for(;iter.first != iter.second; ++(iter.first))
|
|
++degree;
|
|
return degree;
|
|
}
|
|
|
|
// We suppose there are no loops.
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::degree_size_type
|
|
degree(typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_descriptor v, const CMAP_BASE_TYPE& cm)
|
|
{
|
|
return in_degree(v, cm) + out_degree(v, cm);
|
|
}
|
|
|
|
// Expression required by the boost::VertexListGraph concept.
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
std::pair<typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_iterator, typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_iterator>
|
|
vertices(const CMAP_BASE_TYPE& cm)
|
|
{
|
|
typedef typename boost::graph_traits<CMAP_BASE_TYPE >::vertex_iterator iter_type;
|
|
|
|
CMAP_BASE_TYPE& cmap = const_cast<CMAP_BASE_TYPE&>(cm);
|
|
|
|
return std::make_pair<iter_type, iter_type>
|
|
(iter_type(cmap.template one_dart_per_cell<0>().begin()),
|
|
iter_type(cmap.template one_dart_per_cell<0>().end()));
|
|
}
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::vertices_size_type
|
|
num_vertices(const CMAP_BASE_TYPE& cm)
|
|
{
|
|
CMAP_BASE_TYPE& cmap = const_cast<CMAP_BASE_TYPE&>(cm);
|
|
return cmap.template one_dart_per_cell<0>().size();
|
|
}
|
|
|
|
// Expression required by the boost::EdgeListGraph concept.
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
std::pair<typename boost::graph_traits<CMAP_BASE_TYPE >::edge_iterator, typename boost::graph_traits<CMAP_BASE_TYPE >::edge_iterator>
|
|
edges(const CMAP_BASE_TYPE& cm)
|
|
{
|
|
typedef typename boost::graph_traits<CMAP_BASE_TYPE >::edge_iterator iter_type;
|
|
|
|
CMAP_BASE_TYPE& cmap = const_cast<CMAP_BASE_TYPE&>(cm);
|
|
|
|
return std::make_pair<iter_type, iter_type>
|
|
(iter_type(cmap.darts().begin()),
|
|
iter_type(cmap.darts().end()));
|
|
}
|
|
|
|
CMAP_BASE_TEMPLATE_ARGS
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::edges_size_type
|
|
num_edges(const CMAP_BASE_TYPE& cm)
|
|
{
|
|
typedef typename boost::graph_traits<CMAP_BASE_TYPE >::edge_iterator iter_type;
|
|
std::pair<iter_type, iter_type> iter = edges(cm);
|
|
|
|
typename boost::graph_traits<CMAP_BASE_TYPE >::edges_size_type degree=0;
|
|
for(;iter.first != iter.second; ++(iter.first))
|
|
++degree;
|
|
return degree;
|
|
}
|
|
|
|
|
|
}// namespace boost
|
|
|
|
#undef CMAP_BASE_TEMPLATE_ARGS
|
|
#undef CMAP_TEMPLATE_ARGS
|
|
#undef CMAP_TYPE
|
|
#undef CMAP_BASE_TYPE
|
|
#undef LCC_TEMPLATE_ARGS
|
|
#undef LCC_TYPE
|
|
|
|
#endif // CGAL_BOOST_GRAPH_GRAPH_TRAITS_CMAP_H
|