// Copyright (c) 2002 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$ // SPDX-License-Identifier: GPL-3.0+ // // // Author(s) : Sylvain Pion #ifndef CGAL_TRIVIAL_ITERATOR_H #define CGAL_TRIVIAL_ITERATOR_H #include #include #include namespace CGAL { // TODO : // - comparison operators should be global, but it causes problems... // - Have a look at Boost's concept_checking and archetypes : // http://www.boost.org/libs/concept_check/concept_check.htm class Trivial_iterator_tag{}; template class Trivial_iterator { public: typedef I Iterator; typedef Trivial_iterator Self; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::reference reference; typedef typename std::iterator_traits::pointer pointer; typedef Trivial_iterator_tag iterator_category; // Special for circulators. typedef I_Circulator_size_traits C_S_Traits; typedef typename C_S_Traits::size_type size_type; Trivial_iterator() {} Trivial_iterator(const I &i) : base_(i) {} // To allow conversion from iterator to const_iterator. template Trivial_iterator(const Trivial_iterator &t) : base_(t.base()) {} reference operator*() const { return *base_; } pointer operator->() const { return &*base_; } bool operator==(const Trivial_iterator &b) const { return base()==b.base(); } bool operator!=(const Trivial_iterator &b) const { return base()!=b.base(); } private: const Iterator & base() const { return base_; } Iterator base_; }; class Trivial_comparable_iterator_tag{}; template class Trivial_comparable_iterator { public: typedef I Iterator; typedef Trivial_comparable_iterator Self; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::reference reference; typedef typename std::iterator_traits::pointer pointer; typedef Trivial_comparable_iterator_tag iterator_category; // Special for circulators. typedef I_Circulator_size_traits C_S_Traits; typedef typename C_S_Traits::size_type size_type; Trivial_comparable_iterator() {} Trivial_comparable_iterator(const I &i) : base_(i) {} // To allow conversion from iterator to const_iterator. template Trivial_comparable_iterator(const Trivial_comparable_iterator &t) : base_(t.base()) {} reference operator*() const { return *base_; } pointer operator->() const { return &*base_; } bool operator==(const Trivial_comparable_iterator &b) const { return base()==b.base(); } bool operator!=(const Trivial_comparable_iterator &b) const { return base()!=b.base(); } bool operator< (const Trivial_comparable_iterator &b) const { return base()< b.base(); } bool operator> (const Trivial_comparable_iterator &b) const { return base()> b.base(); } bool operator<=(const Trivial_comparable_iterator &b) const { return base()<=b.base(); } bool operator>=(const Trivial_comparable_iterator &b) const { return base()>=b.base(); } private: const Iterator & base() const { return base_; } Iterator base_; }; // Some macros depending on CGAL_NO_CONCEPT_CHECKING. #ifndef CGAL_NO_CONCEPT_CHECKING # define CGAL_TRIVIAL_ITERATOR_CHECKER(X) CGAL::Trivial_iterator # define CGAL_TRIVIAL_COMPARABLE_ITERATOR_CHECKER(X) \ CGAL::Trivial_comparable_iterator #else # define CGAL_TRIVIAL_ITERATOR_CHECKER(X) X # define CGAL_TRIVIAL_COMPARABLE_ITERATOR_CHECKER(X) X #endif } //namespace CGAL #endif // CGAL_TRIVIAL_ITERATOR_H