// Copyright (c) 2004 INRIA Sophia-Antipolis (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 // 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) : Christophe Delage // cell of a triangulation of any dimension <=3 // with hidden points (for the regular triangulation) #ifndef CGAL_REGULAR_TRIANGULATION_CELL_BASE_3_H #define CGAL_REGULAR_TRIANGULATION_CELL_BASE_3_H #include #include #include #include #include #include #include namespace CGAL { template < typename GT, typename Cb = Triangulation_cell_base_3, typename Memory_policy = Keep_hidden_points, typename C = std::list > class Regular_triangulation_cell_base_3 : public Cb { public: typedef typename Cb::Vertex_handle Vertex_handle; typedef typename Cb::Cell_handle Cell_handle; typedef GT Geom_traits; typedef typename Geom_traits::Point_3 Point_3; typedef typename Geom_traits::Weighted_point_3 Point; typedef C Point_container; typedef typename Point_container::iterator Point_iterator; typedef typename Point_container::const_iterator Point_const_iterator; template < typename TDS2 > struct Rebind_TDS { typedef typename Cb::template Rebind_TDS::Other Cb2; typedef Regular_triangulation_cell_base_3 Other; }; Regular_triangulation_cell_base_3() : Cb() {} Regular_triangulation_cell_base_3(Vertex_handle v0, Vertex_handle v1, Vertex_handle v2, Vertex_handle v3) : Cb(v0, v1, v2, v3) {} Regular_triangulation_cell_base_3(Vertex_handle v0, Vertex_handle v1, Vertex_handle v2, Vertex_handle v3, Cell_handle n0, Cell_handle n1, Cell_handle n2, Cell_handle n3) : Cb(v0, v1, v2, v3, n0, n1, n2, n3) {} // because we can't use default templates in ansi... Point_iterator hidden_points_begin() { return hidden_points_begin_internal(); } Point_iterator hidden_points_end() { return hidden_points_end_internal(); } // const versions Point_const_iterator hidden_points_begin() const { return hidden_points_begin_internal(); } Point_const_iterator hidden_points_end() const { return hidden_points_end_internal(); } void hide_point(const Point& p) { hide_point_internal(p); } // Memory_policy is Tag_true ------------------------------------------------- template Point_iterator hidden_points_begin_internal(typename boost::enable_if_c::type* = NULL) { return _hidden.begin(); } template Point_iterator hidden_points_end_internal(typename boost::enable_if_c::type* = NULL) { return _hidden.end(); } template Point_const_iterator hidden_points_begin_internal(typename boost::enable_if_c::type* = NULL) const { return _hidden.begin(); } template Point_const_iterator hidden_points_end_internal(typename boost::enable_if_c::type* = NULL) const { return _hidden.end(); } template void hide_point_internal(const Point& p, typename boost::enable_if_c::type* = NULL) { _hidden.push_back(p); } // Memory_policy is Tag_false ------------------------------------------------ template Point_iterator hidden_points_begin_internal(typename boost::disable_if_c::type* = NULL) { return hidden_points_end(); } template Point_iterator hidden_points_end_internal(typename boost::disable_if_c::type* = NULL) { return _hidden.end(); } // const versions template Point_const_iterator hidden_points_begin_internal(typename boost::disable_if_c::type* = NULL) const { return hidden_points_end(); } template Point_const_iterator hidden_points_end_internal(typename boost::disable_if_c::type* = NULL) const { return _hidden.end(); } template void hide_point_internal(const Point&, typename boost::disable_if_c::type* = NULL) { } //note this function is not requested by the RegularTriangulationCellBase_3 //it should be replaced everywhere by weighted_circumcenter() // but remains here for backward compatibility template Point_3 circumcenter(const GT_& gt) const { BOOST_STATIC_ASSERT(boost::is_same::value); return gt.construct_weighted_circumcenter_3_object() (this->vertex(0)->point(), this->vertex(1)->point(), this->vertex(2)->point(), this->vertex(3)->point()); } Point_3 circumcenter() const { return circumcenter(Geom_traits()); } template Point_3 weighted_circumcenter(const GT_& gt) const { BOOST_STATIC_ASSERT(boost::is_same::value); return gt.construct_weighted_circumcenter_3_object() (this->vertex(0)->point(), this->vertex(1)->point(), this->vertex(2)->point(), this->vertex(3)->point()); } Point_3 weighted_circumcenter() const { return weighted_circumcenter(Geom_traits()); } private: Point_container _hidden; }; } //namespace CGAL #endif // CGAL_REGULAR_TRIANGULATION_CELL_BASE_3_H