From afff35cbddac59237da71ce8f6549d8f6b97507a Mon Sep 17 00:00:00 2001 From: Efi Fogel Date: Tue, 30 Jan 2024 00:55:26 +0200 Subject: [PATCH] Replaced get_data() and set_data() with get_env_data() and set_env_data() to avoid clashes with other extensions of the Dcel; Added template parameters (vertex-base, halfedge-base, and face-base) with default values to Envelope_pm_dcel --- .../CGAL/Envelope_3/Envelope_pm_dcel.h | 499 +++++++----------- 1 file changed, 181 insertions(+), 318 deletions(-) diff --git a/Envelope_3/include/CGAL/Envelope_3/Envelope_pm_dcel.h b/Envelope_3/include/CGAL/Envelope_3/Envelope_pm_dcel.h index c15c2dead3e2..33117b474f9f 100644 --- a/Envelope_3/include/CGAL/Envelope_3/Envelope_pm_dcel.h +++ b/Envelope_3/include/CGAL/Envelope_3/Envelope_pm_dcel.h @@ -7,10 +7,10 @@ // $Id$ // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial // -// Author(s) : Michal Meyerovitch -// Baruch Zukerman -// Ron Wein -// Efi Fogel +// Author(s) : Michal Meyerovitch +// Baruch Zukerman +// Ron Wein +// Efi Fogel #ifndef CGAL_ENVELOPE_PM_DCEL_H #define CGAL_ENVELOPE_PM_DCEL_H @@ -21,19 +21,18 @@ #include #include -namespace CGAL -{ -namespace Envelope_3 -{ +namespace CGAL { -template -class Dcel_info -{ +namespace Envelope_3 { + +template +class Dcel_info { public: - typedef Dcel_info Self; - typedef std::list Data_container; - typedef typename Data_container::iterator Data_iterator; - typedef typename Data_container::const_iterator Data_const_iterator; + using Data = Data_; + using Self = Dcel_info; + using Data_container = std::list; + using Data_iterator = typename Data_container::iterator; + using Data_const_iterator = typename Data_container::const_iterator; protected: /*! data container */ @@ -46,8 +45,7 @@ class Dcel_info Dac_decision m_decision; public: /*! Constructor */ - Dcel_info() : m_is_set(false), m_decision(DAC_DECISION_NOT_SET) - {} + Dcel_info() : m_is_set(false), m_decision(DAC_DECISION_NOT_SET) {} /*! \brief returns true iff data has been set already */ bool get_is_set() const { return m_is_set; } @@ -55,194 +53,127 @@ class Dcel_info /*! \brief resets the flag */ void set_is_set(bool flag) { m_is_set = flag; } - bool is_decision_set() - { - return (m_decision != DAC_DECISION_NOT_SET); - } + bool is_decision_set() { return (m_decision != DAC_DECISION_NOT_SET); } - Dac_decision get_decision() const - { - return m_decision; - } + Dac_decision get_decision() const { return m_decision; } void set_decision(Comparison_result comp) - { - m_decision = enum_cast(comp); - } + { m_decision = enum_cast(comp); } - void set_decision(Dac_decision dec) - { - m_decision = dec; - } + void set_decision(Dac_decision dec) { m_decision = dec; } /*! User-friendly interface: */ - size_t number_of_surfaces () const - { - return (m_data.size()); - } + size_t number_of_surfaces() const { return m_data.size(); } - Data_const_iterator surfaces_begin () const - { - return (m_data.begin()); - } + Data_const_iterator surfaces_begin() const { return m_data.begin(); } - Data_const_iterator surfaces_end () const - { - return (m_data.end()); - } + Data_const_iterator surfaces_end() const { return m_data.end(); } - /*! - * Get the first Xy-monotone surface associated with the face. - * \pre number_of_surfaces() is not 0. - */ - const Data& surface() const - { - CGAL_precondition (m_data.size() > 0); - return (m_data.front()); + /*! Obtain the first Xy-monotone surface associated with the face. + * \pre number_of_surfaces() is not 0. + */ + const Data& surface() const { + CGAL_precondition(m_data.size() > 0); + return m_data.front(); } - /*! - * Get the number of data objects associated with the face. + /*! Obtain the number of data objects associated with the face. */ - int number_of_data_objects() const - { - return static_cast(m_data.size()); - } + int number_of_data_objects() const { return static_cast(m_data.size()); } - /*! - * check if the data is set to be empty + /*! Check whether the data is set to be empty */ bool has_no_data() const - { - return (m_is_set && number_of_data_objects() == 0); - } + { return (m_is_set && (number_of_data_objects() == 0)); } - /*! - * Get the first data object associated with the face. + /*! Obtain the first data object associated with the face. * \pre number_of_data_objects() is not 0. */ - const Data& get_data() const - { - CGAL_precondition (m_data.size() > 0); - - return (m_data.front()); + const Data& get_env_data() const { + CGAL_precondition(m_data.size() > 0); + return m_data.front(); } - /*! - * Get the data iterators (const version). + /*! Obtain the data iterators (const version). */ - Data_const_iterator begin_data() const - { - return (m_data.begin()); - } + Data_const_iterator begin_data() const { return m_data.begin(); } - Data_const_iterator end_data() const - { - return (m_data.end()); - } + Data_const_iterator end_data() const { return m_data.end(); } - /*! - * Get the data iterators (non-const version). + /*! Obtain the data iterators (non-const version). */ - Data_iterator begin_data() - { - return (m_data.begin()); - } + Data_iterator begin_data() { return m_data.begin(); } - Data_iterator end_data() - { - return (m_data.end()); - } + Data_iterator end_data() { return m_data.end(); } - /*! - * Set a data object to the face. + /*! Set a data object to the face. * \param data The data object to set. */ - void set_data (const Data & data) - { + void set_env_data(const Data& data) { clear_data(); add_data(data); } - /*! - * Set a range of data objects to the face. + /*! Set a range of data objects to the face. * \param begin A begin iterator for the data range. * \param end A past-the-end iterator for the data range. */ - template - void set_data(const InputIterator & begin, const InputIterator & end) - { + template + void set_env_data(InputIterator begin, InputIterator end) { clear_data(); add_data(begin, end); } - /*! - * set the data to be empty. + /*! set the data to be empty. */ - void set_no_data() - { + void set_no_data() { clear_data(); m_is_set = true; } - /*! - * Add a data object to the face. + /*! Add a data object to the face. * \param data The additional data object. */ - void add_data (const Data & data) - { + void add_data(const Data& data) { m_data.push_back(data); m_is_set = true; } - /*! - * Add a range of data objects to the face. + /*! Add a range of data objects to the face. * \param begin A begin iterator for the data range. * \param end A past-the-end iterator for the data range. */ - template - void add_data (const InputIterator & begin, const InputIterator & end) - { - InputIterator it; - for (it = begin; it != end; it++) - m_data.push_back(*it); + template + void add_data(InputIterator begin, InputIterator end) { + for (auto it = begin; it != end; it++) m_data.push_back(*it); m_is_set = true; } - /*! - * Clear the data objects. + /*! Clear the data objects. */ - void clear_data () - { + void clear_data() { m_data.clear(); m_is_set = false; } - /*! - * Check if the set of data objects in the input range is equal to our + /*! Check whether the set of data objects in the input range is equal to our * set of data objects */ - template - bool is_equal_data(const InputIterator & begin, const InputIterator & end) - const - { - if (!get_is_set()) - return false; + template + bool is_equal_data(InputIterator begin, InputIterator end) const { + if (! get_is_set()) return false; // insert the input data objects into a set std::set input_data(begin, end); std::set my_data(begin_data(), end_data()); - if (input_data.size() != my_data.size()) - return false; + if (input_data.size() != my_data.size()) return false; return (my_data == input_data); } - template - bool has_equal_data(const InputIterator & begin, const InputIterator & end) - const - { - if (!get_is_set()) - return false; + template + bool has_equal_data(InputIterator begin, InputIterator end) const { + if (! get_is_set()) return false; + // insert the input data objects into a set std::set input_data(begin, end); std::set my_data(begin_data(), end_data()); @@ -260,49 +191,46 @@ class Dcel_info public: template - void set_aux_source(unsigned int id, HandleType h) - { + void set_aux_source(unsigned int id, HandleType h) { CGAL_precondition(id < 2); m_aux_source[id] = make_object(h); } - void set_aux_source(unsigned int id, const Object& o) - { + + void set_aux_source(unsigned int id, const Object& o) { CGAL_precondition(id < 2); CGAL_precondition(!o.is_empty()); m_aux_source[id] = o; } - const Object& get_aux_source(unsigned int id) - { + const Object& get_aux_source(unsigned int id) { CGAL_precondition(id < 2); CGAL_precondition (!m_aux_source[id].is_empty()); return m_aux_source[id]; } /*! \brief returns true iff the point has been set already */ - bool get_aux_is_set(unsigned int id) const - { + bool get_aux_is_set(unsigned int id) const { CGAL_precondition(id < 2); - return (!m_aux_source[id].is_empty()); + return (! m_aux_source[id].is_empty()); } }; /*! Extend the planar-map vertex */ -template -class Envelope_pm_vertex : public CGAL::Arr_vertex_base, - public Dcel_info -{ - typedef CGAL::Arr_vertex_base Base_vertex; - typedef Dcel_info Base_info; - typedef Envelope_pm_vertex Self; +template +class Envelope_pm_vertex : public BaseVertex, public Dcel_info { +public: + using Base_vertex = BaseVertex; + using Vertex_data = VertexData; + +private: + using Self = Envelope_pm_vertex; protected: // all flags are bits in this variable: unsigned short flags; // the flags indications: - enum Bit_pos - { + enum Bit_pos { // for an isolated vertex only IS_EQUAL = 0, IS_EQUAL_AUX = 1, @@ -316,10 +244,12 @@ class Envelope_pm_vertex : public CGAL::Arr_vertex_base, // intersection points IS_INTERSECTION = 7 }; + public: + using Base_info = Dcel_info; + /*! Constructor */ - Envelope_pm_vertex() : Dcel_info(), flags(0) - {} + Envelope_pm_vertex() : Dcel_info(), flags(0) {} /*void set_is_fake(bool b) { @@ -339,42 +269,26 @@ class Envelope_pm_vertex : public CGAL::Arr_vertex_base, return get_bit(IS_FAKE); }*/ - void set_is_equal_data_in_face(bool b) - { - set_bit(IS_EQUAL, b); - } - bool get_is_equal_data_in_face() const - { - return get_bit(IS_EQUAL); - } + void set_is_equal_data_in_face(bool b) { set_bit(IS_EQUAL, b); } + bool get_is_equal_data_in_face() const { return get_bit(IS_EQUAL); } - void set_has_equal_data_in_face(bool b) - { - set_bit(HAS_EQUAL, b); - } - bool get_has_equal_data_in_face() const - { - return get_bit(HAS_EQUAL); - } + void set_has_equal_data_in_face(bool b) { set_bit(HAS_EQUAL, b); } + bool get_has_equal_data_in_face() const { return get_bit(HAS_EQUAL); } - void set_is_equal_aux_data_in_face(unsigned int id, bool b) - { + void set_is_equal_aux_data_in_face(unsigned int id, bool b) { CGAL_assertion(id < 2); set_bit(IS_EQUAL_AUX+id, b); } - bool get_is_equal_aux_data_in_face(unsigned int id) const - { + bool get_is_equal_aux_data_in_face(unsigned int id) const { CGAL_assertion(id < 2); return get_bit(IS_EQUAL_AUX+id); } - void set_has_equal_aux_data_in_face(unsigned int id, bool b) - { + void set_has_equal_aux_data_in_face(unsigned int id, bool b) { CGAL_assertion(id < 2); set_bit(HAS_EQUAL_AUX+id, b); } - bool get_has_equal_aux_data_in_face(unsigned int id) const - { + bool get_has_equal_aux_data_in_face(unsigned int id) const { CGAL_assertion(id < 2); return get_bit(HAS_EQUAL_AUX+id); } @@ -382,8 +296,7 @@ class Envelope_pm_vertex : public CGAL::Arr_vertex_base, /*! Assign from another vertex. * \param v the other vertex. */ - virtual void assign(const Base_vertex & v) - { + virtual void assign(const Base_vertex& v) { Base_vertex::assign(v); const Self & ex_v = static_cast(v); @@ -392,18 +305,13 @@ class Envelope_pm_vertex : public CGAL::Arr_vertex_base, } protected: - void set_bit(unsigned int ind, bool b) - { - if (b) - // set bit "ind" to 1: - flags |= (1 << ind); - else - // set bit "ind" to 0: - flags &= ~(1 << ind); + void set_bit(unsigned int ind, bool b) { + // set bit "ind" to 1 or 0: + if (b) flags |= (1 << ind); + else flags &= ~(1 << ind); } - bool get_bit(unsigned int ind) const - { + bool get_bit(unsigned int ind) const { // (1 << i) is bit i on, other bits off (start counting from 0) unsigned int mask = 1 << ind; return ((flags & mask) == mask); @@ -411,23 +319,22 @@ class Envelope_pm_vertex : public CGAL::Arr_vertex_base, }; /*! Extend the planar-map halfedge */ -template -class -Envelope_pm_halfedge : public CGAL::Arr_halfedge_base, - public Dcel_info -{ - typedef CGAL::Arr_halfedge_base Base_halfedge; - typedef Dcel_info Base_info; - typedef Envelope_pm_halfedge Self; +template +class Envelope_pm_halfedge : public BaseHalfedge, + public Dcel_info { +public: + using Base_halfedge = BaseHalfedge; + using Halfedge_data = HalfedgeData; -protected: +private: + using Self = Envelope_pm_halfedge; +protected: // all flags are bits in this variable: unsigned int flags; // flags indications - enum Bit_pos - { + enum Bit_pos { // indications for the Envelope algorithm // relation between halfedge and incident face IS_EQUAL_FACE = 0, @@ -448,8 +355,9 @@ Envelope_pm_halfedge : public CGAL::Arr_halfedge_base, }; public: - Envelope_pm_halfedge() : Dcel_info(), flags(0) - {} + using Base_info = Dcel_info; + + Envelope_pm_halfedge() : Dcel_info(), flags(0) {} /* void set_is_fake(bool b) { @@ -460,102 +368,64 @@ Envelope_pm_halfedge : public CGAL::Arr_halfedge_base, return get_bit(IS_FAKE); }*/ - void set_is_equal_data_in_face(bool b) - { - set_bit(IS_EQUAL_FACE, b); - } - bool get_is_equal_data_in_face() const - { - return get_bit(IS_EQUAL_FACE); - } + void set_is_equal_data_in_face(bool b) { set_bit(IS_EQUAL_FACE, b); } + bool get_is_equal_data_in_face() const { return get_bit(IS_EQUAL_FACE); } - void set_has_equal_data_in_face(bool b) - { - set_bit(HAS_EQUAL_FACE, b); - } - bool get_has_equal_data_in_face() const - { - return get_bit(HAS_EQUAL_FACE); - } + void set_has_equal_data_in_face(bool b) { set_bit(HAS_EQUAL_FACE, b); } + bool get_has_equal_data_in_face() const { return get_bit(HAS_EQUAL_FACE); } - void set_is_equal_aux_data_in_face(unsigned int id, bool b) - { + void set_is_equal_aux_data_in_face(unsigned int id, bool b) { CGAL_assertion(id < 2); set_bit(IS_EQUAL_AUX_FACE+id, b); } - bool get_is_equal_aux_data_in_face(unsigned int id) const - { + bool get_is_equal_aux_data_in_face(unsigned int id) const { CGAL_assertion(id < 2); return get_bit(IS_EQUAL_AUX_FACE+id); } - void set_has_equal_aux_data_in_face(unsigned int id, bool b) - { + void set_has_equal_aux_data_in_face(unsigned int id, bool b) { CGAL_assertion(id < 2); set_bit(HAS_EQUAL_AUX_FACE+id, b); } - bool get_has_equal_aux_data_in_face(unsigned int id) const - { + bool get_has_equal_aux_data_in_face(unsigned int id) const { CGAL_assertion(id < 2); return get_bit(HAS_EQUAL_AUX_FACE+id); } - void set_is_equal_data_in_target(bool b) - { - set_bit(IS_EQUAL_TARGET, b); - } - bool get_is_equal_data_in_target() const - { - return get_bit(IS_EQUAL_TARGET); - } + void set_is_equal_data_in_target(bool b) { set_bit(IS_EQUAL_TARGET, b); } + bool get_is_equal_data_in_target() const { return get_bit(IS_EQUAL_TARGET); } - void set_has_equal_data_in_target(bool b) - { - set_bit(HAS_EQUAL_TARGET, b); - } - bool get_has_equal_data_in_target() const - { - return get_bit(HAS_EQUAL_TARGET); - } + void set_has_equal_data_in_target(bool b) { set_bit(HAS_EQUAL_TARGET, b); } + bool get_has_equal_data_in_target() const { return get_bit(HAS_EQUAL_TARGET); } - void set_is_equal_aux_data_in_target(unsigned int id, bool b) - { + void set_is_equal_aux_data_in_target(unsigned int id, bool b) { CGAL_assertion(id < 2); set_bit(IS_EQUAL_AUX_TARGET+id, b); } - bool get_is_equal_aux_data_in_target(unsigned int id) const - { + bool get_is_equal_aux_data_in_target(unsigned int id) const { CGAL_assertion(id < 2); return get_bit(IS_EQUAL_AUX_TARGET+id); } - void set_has_equal_aux_data_in_target(unsigned int id, bool b) - { + void set_has_equal_aux_data_in_target(unsigned int id, bool b) { CGAL_assertion(id < 2); set_bit(HAS_EQUAL_AUX_TARGET+id, b); } - bool get_has_equal_aux_data_in_target(unsigned int id) const - { + bool get_has_equal_aux_data_in_target(unsigned int id) const { CGAL_assertion(id < 2); return get_bit(HAS_EQUAL_AUX_TARGET+id); } // access to flags that contain relation between target and face void set_has_equal_data_in_target_and_face(bool b) - { - set_bit(HAS_EQUAL_F_T, b); - } + { set_bit(HAS_EQUAL_F_T, b); } bool get_has_equal_data_in_target_and_face() const - { - return get_bit(HAS_EQUAL_F_T); - } + { return get_bit(HAS_EQUAL_F_T); } - void set_has_equal_aux_data_in_target_and_face(unsigned int id, bool b) - { + void set_has_equal_aux_data_in_target_and_face(unsigned int id, bool b) { CGAL_assertion(id < 2); set_bit(HAS_EQUAL_AUX_F_T+id, b); } - bool get_has_equal_aux_data_in_target_and_face(unsigned int id) const - { + bool get_has_equal_aux_data_in_target_and_face(unsigned int id) const { CGAL_assertion(id < 2); return get_bit(HAS_EQUAL_AUX_F_T+id); } @@ -563,8 +433,7 @@ Envelope_pm_halfedge : public CGAL::Arr_halfedge_base, /*! Assign from another halfedge. * \param h the other halfedge. */ - virtual void assign(const Base_halfedge & h) - { + virtual void assign(const Base_halfedge& h) { Base_halfedge::assign(h); const Self & ex_h = static_cast(h); @@ -573,99 +442,93 @@ Envelope_pm_halfedge : public CGAL::Arr_halfedge_base, } protected: - void set_bit(unsigned int ind, bool b) - { - if (b) - // set bit "ind" to 1: - flags |= (1 << ind); - else - // set bit "ind" to 0: - flags &= ~(1 << ind); + void set_bit(unsigned int ind, bool b) { + if (b) flags |= (1 << ind); + else flags &= ~(1 << ind); CGAL_assertion(get_bit(ind) == b); } - bool get_bit(unsigned int ind) const - { + bool get_bit(unsigned int ind) const { // (1 << i) is bit i on, other bits off (start counting from 0) unsigned int mask = 1 << ind; return ((flags & mask) == mask); } }; -/*! Extend the planar-map face */ -template -class Envelope_pm_face : public CGAL::Arr_face_base, - public Dcel_info -{ - typedef CGAL::Arr_face_base Base_face; - typedef Dcel_info Base_info; - typedef Envelope_pm_face Self; + //! Extend the planar-map face. +template +class Envelope_pm_face : public BaseFace, public Dcel_info { +public: + using Base_face = BaseFace; + using Face_data = FaceData; + +private: + using Self = Envelope_pm_face; public: - typedef std::list Data_container; - typedef typename Data_container::iterator Data_iterator; - typedef typename Data_container::const_iterator Data_const_iterator; + using Base_info = Dcel_info; + using Data_container = std::list; + using Data_iterator = typename Data_container::iterator; + using Data_const_iterator = typename Data_container::const_iterator; - /*! Constructor */ - Envelope_pm_face() : Dcel_info() - {} + /*! Construct. + */ + Envelope_pm_face() : Dcel_info() {} /*! Assign from another face. * \param f the other face. */ - virtual void assign (const Base_face & f) - { + virtual void assign(const Base_face& f) { Base_face::assign(f); - const Self & ex_f = static_cast(f); + const Self& ex_f = static_cast(f); this->Base_info::operator=(ex_f); } }; /*! A new dcel builder with full Envelope features */ -template -class Envelope_pm_dcel : public -CGAL::Arr_dcel_base, - Envelope_pm_halfedge, - Envelope_pm_face > -{ +template , + typename HalfedgeBase = + Arr_halfedge_base, + typename FaceBase = Arr_face_base> +class Envelope_pm_dcel : + public CGAL::Arr_dcel_base, + Envelope_pm_halfedge, + Envelope_pm_face> { public: + using Dcel_data = DcelData; + using Face_base = FaceBase; - typedef Data Face_data; - typedef typename Envelope_pm_face::Data_iterator - Face_data_iterator; - typedef typename Envelope_pm_face::Data_const_iterator - Face_data_const_iterator; - - typedef Data Edge_data; - typedef Face_data_iterator Edge_data_iterator; - typedef Face_data_const_iterator Edge_data_const_iterator; + using Face_data = Dcel_data; + using Env_pm_face = Envelope_pm_face; + using Face_data_iterator = typename Env_pm_face::Data_iterator; + using Face_data_const_iterator = typename Env_pm_face::Data_const_iterator; - typedef Data Vertex_data; - typedef Face_data_iterator Vertex_data_iterator; - typedef Face_data_const_iterator Vertex_data_const_iterator; + using Edge_data = Dcel_data; + using Edge_data_iterator = Face_data_iterator; + using Edge_data_const_iterator = Face_data_const_iterator; - typedef Dcel_info Dcel_elem_with_data; + using Vertex_data = Dcel_data; + using Vertex_data_iterator = Face_data_iterator; + using Vertex_data_const_iterator = Face_data_const_iterator; - typedef Data Dcel_data; - typedef Face_data_iterator Dcel_data_iterator; - typedef Face_data_const_iterator Dcel_data_const_iterator; + using Dcel_elem_with_data = Dcel_info; + using Dcel_data_iterator = Face_data_iterator; + using Dcel_data_const_iterator = Face_data_const_iterator; /*! \struct * An auxiliary structure for rebinding the DCEL with a new traits class. */ template - struct rebind - { - typedef Envelope_pm_dcel other; - }; + struct rebind { typedef Envelope_pm_dcel other; }; /*! Constructor */ Envelope_pm_dcel() {} }; } // namespace Envelope_3 + } // namespace CGAL #endif