// Copyright (c) 2010-2011 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$ // SPDX-License-Identifier: LGPL-3.0+ // // Author(s) : Guillaume Damiand // #ifndef CGAL_DART_H #define CGAL_DART_H 1 #include #include #include #include #include namespace CGAL { template class Compact_container; template class Concurrent_compact_container; template class Combinatorial_map_storage_1; template class Generalized_map_storage_1; template class CMap_linear_cell_complex_storage_1; template class GMap_linear_cell_complex_storage_1; namespace internal { template struct Init_id; } // end namespace internal /** @file Dart.h * Definition of nD dart. */ /** Definition of nD dart without information. * The_dart class describes an nD dart (basic element of a combinatorial or generalized map). * A dart is composed with handle towards its neighbors, * a bitset containing Boolean marks, and handle towards enabled attributes. * n is the dimension of the space (2 for 2D, 3 for 3D...) * Refs the ref class */ template struct Dart_without_info: public Add_id { public: template friend class Combinatorial_map_storage_1; template friend class Generalized_map_storage_1; template friend class CMap_linear_cell_complex_storage_1; template friend class GMap_linear_cell_complex_storage_1; template friend class Compact_container; template friend class Concurrent_compact_container; template friend struct internal::Init_id; 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 WithId 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; void * for_compact_container() const { return mf[0].for_compact_container(); } void * & for_compact_container() { return mf[0].for_compact_container(); } 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 CGAL::cpp11::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 CGAL::cpp11::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; }; #if defined(CGAL_CMAP_DART_DEPRECATED) && !defined(CGAL_NO_DEPRECATED_CODE) #define CGAL_BETAINV(i) (i>1?i:(i==1?0:1)) /** Definition of nD dart for combinatorial map. Add functions beta and attributes which * are now deprecated. */ template struct CGAL_DEPRECATED Dart : public Dart_without_info { template friend class Combinatorial_map_storage_1; template friend class CMap_linear_cell_complex_storage_1; template friend class Compact_container; template friend class Concurrent_compact_container; typedef Dart_without_info Base; using Base::dimension; using Base::mf; using Base::mattribute_handles; typedef typename Base::Dart_handle Dart_handle; typedef typename Base::Dart_const_handle Dart_const_handle; typedef typename Base::Helper Helper; /// Typedef for attributes template struct Attribute_handle: public Refs::template Attribute_handle {}; template struct Attribute_const_handle: public Refs::template Attribute_const_handle {}; public: /** Return the beta of this dart for a given dimension. * @param i the dimension. * @return beta(\em i). */ template Dart_handle beta() { CGAL_assertion(i <= dimension); return mf[i]; } Dart_handle beta(unsigned int i) { CGAL_assertion(i <= dimension); return mf[i]; } template Dart_const_handle beta() const { CGAL_assertion(i <= dimension); return mf[i]; } Dart_const_handle beta(unsigned int i) const { CGAL_assertion(i <= dimension); return mf[i]; } /** Return the beta inverse of this dart for a given dimension. * @param i the dimension. * @return beta^{-1}(\em i). */ template Dart_handle beta_inv() { return beta(); } Dart_handle beta_inv(unsigned int i) { return beta(CGAL_BETAINV(i)); } template Dart_const_handle beta_inv() const { return beta(); } Dart_const_handle beta_inv(unsigned int i) const { return beta(CGAL_BETAINV(i)); } /// @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 CGAL::cpp11::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 CGAL::cpp11::get::value> (mattribute_handles); } }; #else // CGAL_CMAP_DART_DEPRECATED // Dart definition with an info; // (there is a specialization below when Info_==void) template struct Dart : public Dart_without_info { public: template friend class Combinatorial_map_storage_1; template friend class Generalized_map_storage_1; template friend class CMap_linear_cell_complex_storage_1; template friend class GMap_linear_cell_complex_storage_1; template friend class Compact_container; template friend class Concurrent_compact_container; 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; }; #endif // CGAL_CMAP_DART_DEPRECATED } // namespace CGAL #endif // CGAL_DART_H // // EOF //