yat/utility/concept_check.h

Code
Comments
Other
Rev Date Author Line
2259 24 May 10 peter 1 #ifndef _theplu_yat_utility_concept_check_
3536 22 Dec 16 peter 2 #define _theplu_yat_utility_concept_check_
2259 24 May 10 peter 3
2259 24 May 10 peter 4 // $Id$
2259 24 May 10 peter 5
2259 24 May 10 peter 6 /*
4207 26 Aug 22 peter 7   Copyright (C) 2010, 2011, 2013, 2015, 2016, 2017, 2018, 2019, 2022 Peter Johansson
2259 24 May 10 peter 8
2259 24 May 10 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
2259 24 May 10 peter 10
2259 24 May 10 peter 11   The yat library is free software; you can redistribute it and/or
2259 24 May 10 peter 12   modify it under the terms of the GNU General Public License as
2259 24 May 10 peter 13   published by the Free Software Foundation; either version 3 of the
2259 24 May 10 peter 14   License, or (at your option) any later version.
2259 24 May 10 peter 15
2259 24 May 10 peter 16   The yat library is distributed in the hope that it will be useful,
2259 24 May 10 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
2259 24 May 10 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2259 24 May 10 peter 19   General Public License for more details.
2259 24 May 10 peter 20
2259 24 May 10 peter 21   You should have received a copy of the GNU General Public License
2259 24 May 10 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
2259 24 May 10 peter 23 */
2259 24 May 10 peter 24
2673 03 Dec 11 peter 25 // always include config first
2673 03 Dec 11 peter 26 #include "config_public.h"
2673 03 Dec 11 peter 27
2263 26 May 10 peter 28 #include "iterator_traits.h"
3548 01 Jan 17 peter 29 #include "WeightedIteratorArchetype.h"
2263 26 May 10 peter 30
2334 15 Oct 10 peter 31 #include <boost/concept_archetype.hpp>
2259 24 May 10 peter 32 #include <boost/concept_check.hpp>
3548 01 Jan 17 peter 33 #include <boost/iterator/iterator_archetypes.hpp>
3393 17 Mar 15 peter 34 #include <boost/iterator/iterator_concepts.hpp>
2259 24 May 10 peter 35
2259 24 May 10 peter 36 namespace theplu {
2259 24 May 10 peter 37 namespace yat {
2259 24 May 10 peter 38 namespace utility {
2259 24 May 10 peter 39
3788 29 Jan 19 peter 40   namespace detail {
3788 29 Jan 19 peter 41     template<typename T>
3788 29 Jan 19 peter 42     void avoid_compiler_warning(const T& t) {}
3788 29 Jan 19 peter 43   }
3788 29 Jan 19 peter 44
3788 29 Jan 19 peter 45
2259 24 May 10 peter 46   /**
2259 24 May 10 peter 47      \brief Concept check for \ref concept_container_2d
2259 24 May 10 peter 48
4200 19 Aug 22 peter 49      This class is intended to be used in a <a
2259 24 May 10 peter 50      href="\boost_url/concept_check/using_concept_check.htm">
2259 24 May 10 peter 51      BOOST_CONCEPT_ASSERT </a>
2259 24 May 10 peter 52
2259 24 May 10 peter 53      \code
2259 24 May 10 peter 54      template<class T>
2259 24 May 10 peter 55      void some_function(const T& t)
2259 24 May 10 peter 56      {
2259 24 May 10 peter 57      BOOST_CONCEPT_ASSERT((Container2D<T>));
2259 24 May 10 peter 58      ...
2259 24 May 10 peter 59      }
2259 24 May 10 peter 60      \endcode
2334 15 Oct 10 peter 61
2334 15 Oct 10 peter 62      \since New in yat 0.7
2259 24 May 10 peter 63   */
2259 24 May 10 peter 64   template <class T>
2259 24 May 10 peter 65   class Container2D
2259 24 May 10 peter 66   {
2259 24 May 10 peter 67   public:
2673 03 Dec 11 peter 68 #ifdef YAT_HAVE_BOOST_CONCEPT_WITH_CONSTRUCTOR
2411 13 Jan 11 peter 69     /// Default constructor
2411 13 Jan 11 peter 70     Container2D(void) {}
2673 03 Dec 11 peter 71 #endif
2411 13 Jan 11 peter 72
2259 24 May 10 peter 73     /// value_type
2259 24 May 10 peter 74     typedef typename T::value_type value_type;
2259 24 May 10 peter 75     /// const_reference
2259 24 May 10 peter 76     typedef typename T::const_reference const_reference;
2259 24 May 10 peter 77     /// const_iterator
2259 24 May 10 peter 78     typedef typename T::const_iterator const_iterator;
2259 24 May 10 peter 79     /// const_row_iterator
2259 24 May 10 peter 80     typedef typename T::const_row_iterator const_row_iterator;
2259 24 May 10 peter 81     /// const_column_iterator
2259 24 May 10 peter 82     typedef typename T::const_column_iterator const_column_iterator;
2259 24 May 10 peter 83
2259 24 May 10 peter 84     /**
2259 24 May 10 peter 85        \brief function doing the concept test
2259 24 May 10 peter 86      */
2259 24 May 10 peter 87     BOOST_CONCEPT_USAGE(Container2D)
2259 24 May 10 peter 88     {
4132 21 Jan 22 peter 89       const_iterator iter_ = t_->begin();
4132 21 Jan 22 peter 90       iter_ = t_->end();
3788 29 Jan 19 peter 91       detail::avoid_compiler_warning(iter_);
4132 21 Jan 22 peter 92       const_row_iterator row_iter_ = t_->begin_row(0);
4132 21 Jan 22 peter 93       row_iter_ = t_->end_row(0);
3788 29 Jan 19 peter 94       detail::avoid_compiler_warning(row_iter_);
4132 21 Jan 22 peter 95       const_column_iterator col_iter_ = t_->begin_column(0);
4132 21 Jan 22 peter 96       col_iter_ = t_->end_column(0);
3788 29 Jan 19 peter 97       detail::avoid_compiler_warning(col_iter_);
4132 21 Jan 22 peter 98       const_reference r = (*t_)(0,0);
2259 24 May 10 peter 99       value_ = r;
4132 21 Jan 22 peter 100       size_t n = t_->rows();
4132 21 Jan 22 peter 101       n = t_->columns();
3788 29 Jan 19 peter 102       detail::avoid_compiler_warning(n);
3393 17 Mar 15 peter 103       using boost_concepts::ReadableIterator;
3393 17 Mar 15 peter 104       BOOST_CONCEPT_ASSERT((ReadableIterator<const_iterator>));
3393 17 Mar 15 peter 105       BOOST_CONCEPT_ASSERT((ReadableIterator<const_row_iterator>));
3393 17 Mar 15 peter 106       BOOST_CONCEPT_ASSERT((ReadableIterator<const_column_iterator>));
2259 24 May 10 peter 107     }
2259 24 May 10 peter 108
2259 24 May 10 peter 109   private:
4132 21 Jan 22 peter 110     T* t_;
2259 24 May 10 peter 111     value_type value_;
2259 24 May 10 peter 112   };
2259 24 May 10 peter 113
2260 25 May 10 peter 114   /**
2260 25 May 10 peter 115      \brief Concept check for \ref concept_mutable_container_2d
2260 25 May 10 peter 116
4200 19 Aug 22 peter 117      This class is intended to be used in a <a
2260 25 May 10 peter 118      href="\boost_url/concept_check/using_concept_check.htm">
2260 25 May 10 peter 119      BOOST_CONCEPT_ASSERT </a>
2260 25 May 10 peter 120
2260 25 May 10 peter 121      \code
2260 25 May 10 peter 122      template<class T>
2260 25 May 10 peter 123      void some_function(const T& t)
2260 25 May 10 peter 124      {
2260 25 May 10 peter 125      BOOST_CONCEPT_ASSERT((Mutable_Container2D<T>));
2260 25 May 10 peter 126      ...
2260 25 May 10 peter 127      }
2260 25 May 10 peter 128      \endcode
2334 15 Oct 10 peter 129
2334 15 Oct 10 peter 130      \since New in yat 0.7
2260 25 May 10 peter 131   */
2260 25 May 10 peter 132   template <class T>
2260 25 May 10 peter 133   class Mutable_Container2D : public Container2D<T>
2260 25 May 10 peter 134   {
2260 25 May 10 peter 135   public:
2260 25 May 10 peter 136     /// reference
2260 25 May 10 peter 137     typedef typename T::reference reference;
2260 25 May 10 peter 138     /// iterator
2260 25 May 10 peter 139     typedef typename T::iterator iterator;
2260 25 May 10 peter 140     /// row_iterator
2260 25 May 10 peter 141     typedef typename T::row_iterator row_iterator;
2260 25 May 10 peter 142     /// column_iterator
2260 25 May 10 peter 143     typedef typename T::column_iterator column_iterator;
2260 25 May 10 peter 144
2260 25 May 10 peter 145     /**
2260 25 May 10 peter 146        \brief function doing the concept test
2260 25 May 10 peter 147      */
2260 25 May 10 peter 148     BOOST_CONCEPT_USAGE(Mutable_Container2D)
2260 25 May 10 peter 149     {
4132 21 Jan 22 peter 150       iterator iter_ = t_->begin();
4132 21 Jan 22 peter 151       iter_ = t_->end();
3788 29 Jan 19 peter 152       detail::avoid_compiler_warning(iter_);
4132 21 Jan 22 peter 153       row_iterator row_iter_ = t_->begin_row(0);
4132 21 Jan 22 peter 154       row_iter_ = t_->end_row(0);
3788 29 Jan 19 peter 155       detail::avoid_compiler_warning(row_iter_);
4132 21 Jan 22 peter 156       column_iterator col_iter_ = t_->begin_column(0);
4132 21 Jan 22 peter 157       col_iter_ = t_->end_column(0);
3788 29 Jan 19 peter 158       detail::avoid_compiler_warning(col_iter_);
4132 21 Jan 22 peter 159       reference r = (*t_)(0,0);
4132 21 Jan 22 peter 160       (*t_)(0,0) = r;
3788 29 Jan 19 peter 161       detail::avoid_compiler_warning(r);
2260 25 May 10 peter 162       using boost::Mutable_RandomAccessIterator; // just to avoid long lines
2260 25 May 10 peter 163       BOOST_CONCEPT_ASSERT((Mutable_RandomAccessIterator<iterator>));
2260 25 May 10 peter 164       BOOST_CONCEPT_ASSERT((Mutable_RandomAccessIterator<row_iterator>));
2260 25 May 10 peter 165       BOOST_CONCEPT_ASSERT((Mutable_RandomAccessIterator<column_iterator>));
2260 25 May 10 peter 166     }
2260 25 May 10 peter 167   private:
4132 21 Jan 22 peter 168     T* t_;
2260 25 May 10 peter 169   };
2260 25 May 10 peter 170
2263 26 May 10 peter 171
2263 26 May 10 peter 172   /**
3775 26 Oct 18 peter 173      \brief Concept check for Trivial Iterator
2263 26 May 10 peter 174
4200 19 Aug 22 peter 175      This class is intended to be used in a <a
2263 26 May 10 peter 176      href="\boost_url/concept_check/using_concept_check.htm">
2263 26 May 10 peter 177      BOOST_CONCEPT_ASSERT </a>
2263 26 May 10 peter 178
2263 26 May 10 peter 179      \code
2263 26 May 10 peter 180      template<class Iterator>
2263 26 May 10 peter 181      void some_function(const Iterator& it)
2263 26 May 10 peter 182      {
2263 26 May 10 peter 183      BOOST_CONCEPT_ASSERT((TrivialIterator<Iterator>));
2263 26 May 10 peter 184      ...
2263 26 May 10 peter 185      }
2263 26 May 10 peter 186      \endcode
2334 15 Oct 10 peter 187
2334 15 Oct 10 peter 188      \since New in yat 0.7
2263 26 May 10 peter 189   */
2263 26 May 10 peter 190   template <class T>
2263 26 May 10 peter 191   class TrivialIterator
2263 26 May 10 peter 192     : public boost::Assignable<T>
2263 26 May 10 peter 193     , public boost::EqualityComparable<T>
2263 26 May 10 peter 194     , public boost::DefaultConstructible<T>
2263 26 May 10 peter 195
2263 26 May 10 peter 196   {
2263 26 May 10 peter 197   public:
2263 26 May 10 peter 198     /// iterator_category
2263 26 May 10 peter 199     typedef typename std::iterator_traits<T>::iterator_category iterator_category;
2263 26 May 10 peter 200     /// value_type
2263 26 May 10 peter 201     typedef typename std::iterator_traits<T>::value_type value_type;
2263 26 May 10 peter 202     /// difference_type
2263 26 May 10 peter 203     typedef typename std::iterator_traits<T>::difference_type difference_type;
2263 26 May 10 peter 204     /// pointer
2263 26 May 10 peter 205     typedef typename std::iterator_traits<T>::pointer pointer;
2263 26 May 10 peter 206     /// reference
2263 26 May 10 peter 207     typedef typename std::iterator_traits<T>::reference reference;
2263 26 May 10 peter 208
2263 26 May 10 peter 209     /**
2263 26 May 10 peter 210        \brief function doing the concept test
2263 26 May 10 peter 211      */
2263 26 May 10 peter 212     BOOST_CONCEPT_USAGE(TrivialIterator)
2263 26 May 10 peter 213     {
2263 26 May 10 peter 214       T t;
2263 26 May 10 peter 215       value_ = *t;
2263 26 May 10 peter 216     }
2263 26 May 10 peter 217   private:
2263 26 May 10 peter 218     value_type value_;
2263 26 May 10 peter 219   };
2263 26 May 10 peter 220
2263 26 May 10 peter 221   /**
2263 26 May 10 peter 222      \brief Concept check for \ref concept_data_iterator
2263 26 May 10 peter 223
4200 19 Aug 22 peter 224      This class is intended to be used in a <a
2263 26 May 10 peter 225      href="\boost_url/concept_check/using_concept_check.htm">
2263 26 May 10 peter 226      BOOST_CONCEPT_ASSERT </a>
2263 26 May 10 peter 227
2263 26 May 10 peter 228      \code
2263 26 May 10 peter 229      template<class Iterator>
2263 26 May 10 peter 230      void some_function(const Iterator& it)
2263 26 May 10 peter 231      {
2263 26 May 10 peter 232      BOOST_CONCEPT_ASSERT((DataIteratorConcept<Iterator>));
2263 26 May 10 peter 233      ...
2263 26 May 10 peter 234      }
2263 26 May 10 peter 235      \endcode
2334 15 Oct 10 peter 236
2334 15 Oct 10 peter 237      \since New in yat 0.7
2263 26 May 10 peter 238   */
2263 26 May 10 peter 239   template <class T>
2263 26 May 10 peter 240   class DataIteratorConcept
2263 26 May 10 peter 241   {
2263 26 May 10 peter 242   public:
2263 26 May 10 peter 243     /// tag
2263 26 May 10 peter 244     typedef typename weighted_iterator_traits<T>::type tag;
2263 26 May 10 peter 245     /// value_type
2263 26 May 10 peter 246     typedef typename std::iterator_traits<T>::value_type value_type;
2263 26 May 10 peter 247
2263 26 May 10 peter 248     /**
2263 26 May 10 peter 249        \brief function doing the concept test
2263 26 May 10 peter 250      */
2263 26 May 10 peter 251     BOOST_CONCEPT_USAGE(DataIteratorConcept)
2263 26 May 10 peter 252     {
3579 16 Jan 17 peter 253       BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<T>));
3579 16 Jan 17 peter 254       BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<T>));
2263 26 May 10 peter 255       tag t;
2263 26 May 10 peter 256       constraints(t);
2263 26 May 10 peter 257     }
2263 26 May 10 peter 258   private:
2263 26 May 10 peter 259     void constraints(yat::utility::unweighted_iterator_tag t) const
3788 29 Jan 19 peter 260     {
2263 26 May 10 peter 261       BOOST_CONCEPT_ASSERT((boost::Convertible<value_type, double>));
2263 26 May 10 peter 262     }
2263 26 May 10 peter 263
2263 26 May 10 peter 264     void constraints(yat::utility::weighted_iterator_tag t) const
2263 26 May 10 peter 265     {
2263 26 May 10 peter 266       BOOST_CONCEPT_ASSERT((boost::Convertible<value_type, DataWeight>));
2263 26 May 10 peter 267     }
2334 15 Oct 10 peter 268   };
2263 26 May 10 peter 269
2334 15 Oct 10 peter 270
2334 15 Oct 10 peter 271   /**
2334 15 Oct 10 peter 272      \brief Concept check for a \ref concept_distance
2334 15 Oct 10 peter 273
3788 29 Jan 19 peter 274      This class is intended to be used in a <a
2334 15 Oct 10 peter 275      href="\boost_url/concept_check/using_concept_check.htm">
2334 15 Oct 10 peter 276      BOOST_CONCEPT_ASSERT </a>
2334 15 Oct 10 peter 277
2334 15 Oct 10 peter 278      \code
2334 15 Oct 10 peter 279      template<class Distance>
2334 15 Oct 10 peter 280      void some_function(double x)
2334 15 Oct 10 peter 281      {
2334 15 Oct 10 peter 282      BOOST_CONCEPT_ASSERT((DistanceConcept<Distance>));
2334 15 Oct 10 peter 283      ...
2334 15 Oct 10 peter 284      }
2334 15 Oct 10 peter 285      \endcode
2334 15 Oct 10 peter 286
2334 15 Oct 10 peter 287      \since New in yat 0.7
2334 15 Oct 10 peter 288   */
2334 15 Oct 10 peter 289   template <class T>
2340 16 Oct 10 peter 290   class DistanceConcept : public boost::CopyConstructible<T>
2334 15 Oct 10 peter 291   {
2334 15 Oct 10 peter 292   public:
2334 15 Oct 10 peter 293     /**
2334 15 Oct 10 peter 294        \brief function doing the concept test
2334 15 Oct 10 peter 295      */
2334 15 Oct 10 peter 296     BOOST_CONCEPT_USAGE(DistanceConcept)
2334 15 Oct 10 peter 297     {
3548 01 Jan 17 peter 298       using boost::iterator_archetypes::readable_iterator_t;
3548 01 Jan 17 peter 299       using boost::forward_traversal_tag;
3548 01 Jan 17 peter 300       boost::iterator_archetype<double, readable_iterator_t,
3548 01 Jan 17 peter 301                                 forward_traversal_tag> unweighted;
3548 01 Jan 17 peter 302       WeightedIteratorArchetype<readable_iterator_t, forward_traversal_tag>
3548 01 Jan 17 peter 303         weighted;
3103 02 Nov 13 peter 304       double d=0;
3103 02 Nov 13 peter 305       d += distance_(unweighted, unweighted, unweighted);
3103 02 Nov 13 peter 306       d += distance_(unweighted, unweighted, weighted);
3103 02 Nov 13 peter 307       d += distance_(weighted, weighted, unweighted);
3103 02 Nov 13 peter 308       d += distance_(weighted, weighted, weighted);
3788 29 Jan 19 peter 309       detail::avoid_compiler_warning(d);
2334 15 Oct 10 peter 310     }
2334 15 Oct 10 peter 311   private:
2334 15 Oct 10 peter 312     T distance_;
2263 26 May 10 peter 313   };
2263 26 May 10 peter 314
2259 24 May 10 peter 315 }}} // of namespace utility, yat, and theplu
2259 24 May 10 peter 316 #endif