// Copyright (c) 2010-2011 CNRS and LIRIS' Establishments (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org) // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Guillaume Damiand // #ifndef CGAL_DART_WITH_INDEX_H #define CGAL_DART_WITH_INDEX_H 1 #include #include #include #include #include namespace CGAL { template class Compact_container_with_index_2; template class Combinatorial_map_storage_2; template class Generalized_map_storage_2; template class CMap_linear_cell_complex_storage_2; template class GMap_linear_cell_complex_storage_2; namespace Index { template struct Dart_without_info { template friend class CGAL::Compact_container_with_index_2; template friend class CGAL::Combinatorial_map_storage_2; template friend class CGAL::Generalized_map_storage_2; template friend class CGAL::CMap_linear_cell_complex_storage_2; template friend class CGAL::GMap_linear_cell_complex_storage_2; typedef Dart_without_info Self; typedef typename Refs::Dart_handle Dart_handle; typedef typename Refs::size_type size_type; typedef typename Refs::Dart_const_handle Dart_const_handle; typedef typename Refs::Helper Helper; typedef CGAL::Tag_false Has_id; /// Typedef for attributes template struct Attribute_handle: public Refs::template Attribute_handle {}; template struct Attribute_const_handle: public Refs::template Attribute_const_handle {}; /// The number of used marks. static const size_type NB_MARKS = Refs::NB_MARKS; /// The dimension of the combinatorial map. static const unsigned int dimension = d; size_type for_compact_container_with_index() const { return mf[0].for_compact_container_with_index(); } size_type& for_compact_container_with_index() { return mf[0].for_compact_container_with_index(); } Dart_handle get_f(unsigned int i) const { assert(i<=dimension); return mf[i]; } protected: /** Default constructor: no real initialisation, * because this is done in the combinatorial map class. */ Dart_without_info() {} /** Copy constructor: * @param adart a dart. */ Dart_without_info(const Dart_without_info& adart) : mmarks(adart.mmarks), mattribute_handles(adart.mattribute_handles) { for (unsigned int i = 0; i <= dimension; ++i) mf[i] = adart.mf[i]; } /** Return the mark value of a given mark number. * @param amark the mark number. * @return the value for this number. */ bool get_mark(size_type amark) const { CGAL_assertion(amark>=0 && amark=0 && amark=0 && amark get_marks() const { return mmarks; } /** Set simultaneously all the marks of this dart to a given value. * @param amarks the value of the marks. */ void set_marks(const std::bitset& amarks) const { mmarks = amarks; } /// @return a handle on the i-attribute template typename Attribute_handle::type attribute() { CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mattribute_handles); } template typename Attribute_const_handle::type attribute() const { CGAL_static_assertion_msg(Helper::template Dimension_index::value>=0, "attribute called but i-attributes are disabled."); return std::get::value> (mattribute_handles); } protected: /// Neighboors for each dimension +1 (from 0 to dimension). Dart_handle mf[dimension+1]; /// Values of Boolean marks. mutable std::bitset mmarks; /// Attributes enabled typename Helper::Attribute_handles mattribute_handles; }; // Dart definition with an info; // (there is a specialization below when Info_==void) template struct Dart : public Dart_without_info { public: template friend class CGAL::Compact_container_with_index_2; template friend class CGAL::Combinatorial_map_storage_2; template friend class CGAL::Generalized_map_storage_2; template friend class CGAL::CMap_linear_cell_complex_storage_2; template friend class CGAL::GMap_linear_cell_complex_storage_2; typedef Dart Self; typedef Info_ Info; protected: /** Default constructor: no real initialisation, * because this is done in the combinatorial or generalized map class. */ Dart() {} Dart(const Info_& info) : minfo(info) {} Info_& info() { return minfo; } const Info_& info() const { return minfo; } protected: Info minfo; }; // Specialization of Dart class when info==void template struct Dart : public Dart_without_info { public: typedef CGAL::Void Info; }; } // namespace Index } // namespace CGAL #endif // CGAL_DART_WITH_INDEX_H // // EOF //