test/weighted_iterator_archetype.cc

Code
Comments
Other
Rev Date Author Line
3314 13 Sep 14 peter 1 // $Id$
3314 13 Sep 14 peter 2
3314 13 Sep 14 peter 3 /*
3579 16 Jan 17 peter 4   Copyright (C) 2014, 2015, 2016, 2017 Peter Johansson
3314 13 Sep 14 peter 5
3314 13 Sep 14 peter 6   This file is part of the yat library, http://dev.thep.lu.se/yat
3314 13 Sep 14 peter 7
3314 13 Sep 14 peter 8   The yat library is free software; you can redistribute it and/or
3314 13 Sep 14 peter 9   modify it under the terms of the GNU General Public License as
3314 13 Sep 14 peter 10   published by the Free Software Foundation; either version 3 of the
3314 13 Sep 14 peter 11   License, or (at your option) any later version.
3314 13 Sep 14 peter 12
3314 13 Sep 14 peter 13   The yat library is distributed in the hope that it will be useful,
3314 13 Sep 14 peter 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
3314 13 Sep 14 peter 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3314 13 Sep 14 peter 16   General Public License for more details.
3314 13 Sep 14 peter 17
3314 13 Sep 14 peter 18   You should have received a copy of the GNU General Public License
3314 13 Sep 14 peter 19   along with yat. If not, see <http://www.gnu.org/licenses/>.
3314 13 Sep 14 peter 20 */
3314 13 Sep 14 peter 21
3534 21 Dec 16 peter 22 // Test that class utility::WeightedIteratorArchetype works as
3314 13 Sep 14 peter 23 // intended. If the class does not work on a system (and this test
3314 13 Sep 14 peter 24 // fails), it probably cause many other failures and it probably a
3314 13 Sep 14 peter 25 // good idea to fix this test first before the other failures (which
3314 13 Sep 14 peter 26 // might be bogus).
3314 13 Sep 14 peter 27
3314 13 Sep 14 peter 28
3314 13 Sep 14 peter 29 #include <config.h>
3314 13 Sep 14 peter 30
3314 13 Sep 14 peter 31 #include "Suite.h"
3314 13 Sep 14 peter 32
3314 13 Sep 14 peter 33 #include "yat/utility/concept_check.h"
3376 11 Feb 15 peter 34 #include "yat/utility/iterator_traits.h"
3534 21 Dec 16 peter 35 #include "yat/utility/WeightedIteratorArchetype.h"
3314 13 Sep 14 peter 36
3314 13 Sep 14 peter 37 #include <boost/iterator/iterator_archetypes.hpp>
3314 13 Sep 14 peter 38 #include <boost/iterator/iterator_categories.hpp>
3314 13 Sep 14 peter 39 #include <boost/iterator/iterator_concepts.hpp>
3377 11 Feb 15 peter 40 #include <boost/static_assert.hpp>
3377 11 Feb 15 peter 41 #include <boost/type_traits.hpp>
3314 13 Sep 14 peter 42
3314 13 Sep 14 peter 43 using namespace theplu::yat;
3314 13 Sep 14 peter 44 using namespace boost::iterator_archetypes;
3314 13 Sep 14 peter 45
3314 13 Sep 14 peter 46 template<typename Iterator>
3314 13 Sep 14 peter 47 void test_const_access(Iterator iterator)
3314 13 Sep 14 peter 48 {
3314 13 Sep 14 peter 49   BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<Iterator>));
3314 13 Sep 14 peter 50 }
3314 13 Sep 14 peter 51
3314 13 Sep 14 peter 52
3314 13 Sep 14 peter 53 template<typename Iterator>
3314 13 Sep 14 peter 54 void test_access(Iterator iterator)
3314 13 Sep 14 peter 55 {
3314 13 Sep 14 peter 56   BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<Iterator>));
3314 13 Sep 14 peter 57   BOOST_CONCEPT_ASSERT((boost_concepts::WritableIterator<Iterator>));
3314 13 Sep 14 peter 58 }
3314 13 Sep 14 peter 59
3314 13 Sep 14 peter 60
3314 13 Sep 14 peter 61 template<typename Iterator>
3314 13 Sep 14 peter 62 void test_traversal(Iterator iterator, boost::incrementable_traversal_tag)
3314 13 Sep 14 peter 63 {
3314 13 Sep 14 peter 64   BOOST_CONCEPT_ASSERT((boost_concepts::IncrementableIterator<Iterator>));
3314 13 Sep 14 peter 65 }
3314 13 Sep 14 peter 66
3314 13 Sep 14 peter 67
3314 13 Sep 14 peter 68 template<typename Iterator>
3314 13 Sep 14 peter 69 void test_traversal(Iterator iterator, boost::single_pass_traversal_tag)
3314 13 Sep 14 peter 70 {
3314 13 Sep 14 peter 71   BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<Iterator>));
3314 13 Sep 14 peter 72 }
3314 13 Sep 14 peter 73
3314 13 Sep 14 peter 74
3314 13 Sep 14 peter 75 template<typename Iterator>
3314 13 Sep 14 peter 76 void test_traversal(Iterator iterator, boost::forward_traversal_tag)
3314 13 Sep 14 peter 77 {
3314 13 Sep 14 peter 78   BOOST_CONCEPT_ASSERT((boost_concepts::ForwardTraversal<Iterator>));
3314 13 Sep 14 peter 79 }
3314 13 Sep 14 peter 80
3314 13 Sep 14 peter 81
3314 13 Sep 14 peter 82 template<typename Iterator>
3314 13 Sep 14 peter 83 void test_traversal(Iterator iterator, boost::bidirectional_traversal_tag)
3314 13 Sep 14 peter 84 {
3314 13 Sep 14 peter 85   BOOST_CONCEPT_ASSERT((boost_concepts::BidirectionalTraversal<Iterator>));
3314 13 Sep 14 peter 86 }
3314 13 Sep 14 peter 87
3314 13 Sep 14 peter 88
3314 13 Sep 14 peter 89 template<typename Iterator>
3314 13 Sep 14 peter 90 void test_traversal(Iterator iterator, boost::random_access_traversal_tag)
3314 13 Sep 14 peter 91 {
3314 13 Sep 14 peter 92   BOOST_CONCEPT_ASSERT((boost_concepts::RandomAccessTraversal<Iterator>));
3314 13 Sep 14 peter 93 }
3314 13 Sep 14 peter 94
3314 13 Sep 14 peter 95
3314 13 Sep 14 peter 96 template<typename Iterator, typename ConstIterator>
3314 13 Sep 14 peter 97 void test_interoperability(Iterator i, ConstIterator ci,
3314 13 Sep 14 peter 98                            boost::single_pass_traversal_tag)
3314 13 Sep 14 peter 99 {
3314 13 Sep 14 peter 100   BOOST_CONCEPT_ASSERT((boost_concepts::InteroperableIterator<Iterator, ConstIterator>));
3314 13 Sep 14 peter 101 }
3314 13 Sep 14 peter 102
3314 13 Sep 14 peter 103
3314 13 Sep 14 peter 104 template<typename Iterator, typename ConstIterator>
3314 13 Sep 14 peter 105 void test_interoperability(Iterator i, ConstIterator ci,
3314 13 Sep 14 peter 106                            boost::incrementable_traversal_tag)
3314 13 Sep 14 peter 107 {
3314 13 Sep 14 peter 108 }
3314 13 Sep 14 peter 109
3314 13 Sep 14 peter 110
3314 13 Sep 14 peter 111 template<typename TraversalCategory>
3314 13 Sep 14 peter 112 void test1(void)
3314 13 Sep 14 peter 113 {
3534 21 Dec 16 peter 114   utility::WeightedIteratorArchetype_ctor_arg arg;
3314 13 Sep 14 peter 115   using boost::iterator_archetypes::readable_iterator_t;
3534 21 Dec 16 peter 116   typedef utility::WeightedIteratorArchetype<readable_iterator_t,
3534 21 Dec 16 peter 117                                                TraversalCategory>
3314 13 Sep 14 peter 118     ConstIterator;
3376 11 Feb 15 peter 119   typedef typename utility::weighted_iterator_traits<ConstIterator>::type tag1;
3377 11 Feb 15 peter 120   using utility::weighted_iterator_tag;
3377 11 Feb 15 peter 121   using boost::is_same;
3377 11 Feb 15 peter 122   BOOST_STATIC_ASSERT((is_same<tag1, weighted_iterator_tag>::type::value));
3314 13 Sep 14 peter 123   ConstIterator ci(arg);
3314 13 Sep 14 peter 124   test_const_access(ci);
3314 13 Sep 14 peter 125   TraversalCategory traversal;
3314 13 Sep 14 peter 126   test_traversal(ci, traversal);
3314 13 Sep 14 peter 127
3314 13 Sep 14 peter 128   using boost::iterator_archetypes::readable_writable_iterator_t;
3534 21 Dec 16 peter 129   typedef utility::WeightedIteratorArchetype<readable_writable_iterator_t,
3534 21 Dec 16 peter 130                                                TraversalCategory> Iterator;
3376 11 Feb 15 peter 131
3376 11 Feb 15 peter 132   typedef typename utility::weighted_iterator_traits<Iterator>::type tag2;
3377 11 Feb 15 peter 133   BOOST_STATIC_ASSERT((is_same<tag2, weighted_iterator_tag>::type::value));
3314 13 Sep 14 peter 134   Iterator i(arg);
3314 13 Sep 14 peter 135   test_access(i);
3314 13 Sep 14 peter 136   test_traversal(i, traversal);
3314 13 Sep 14 peter 137
3314 13 Sep 14 peter 138   test_interoperability(i, ci, traversal);
3543 23 Dec 16 peter 139
3314 13 Sep 14 peter 140 }
3314 13 Sep 14 peter 141
3314 13 Sep 14 peter 142
3543 23 Dec 16 peter 143 // test test::DataIterator
3543 23 Dec 16 peter 144 template<typename TraversalCategory>
3543 23 Dec 16 peter 145 void test2(void)
3543 23 Dec 16 peter 146 {
3543 23 Dec 16 peter 147   TraversalCategory traversal;
3543 23 Dec 16 peter 148   typedef test::DataIterator<TraversalCategory> trait;
3543 23 Dec 16 peter 149   typename trait::unweighted_const_iterator const_iterator;
3543 23 Dec 16 peter 150   test_const_access(const_iterator);
3543 23 Dec 16 peter 151   test_traversal(const_iterator, traversal);
3543 23 Dec 16 peter 152   typename trait::unweighted_iterator iterator;
3543 23 Dec 16 peter 153   test_access(iterator);
3543 23 Dec 16 peter 154   test_traversal(iterator, traversal);
3543 23 Dec 16 peter 155
3543 23 Dec 16 peter 156   typename trait::weighted_const_iterator weighted_const_iterator;
3543 23 Dec 16 peter 157   test_const_access(weighted_const_iterator);
3543 23 Dec 16 peter 158   test_traversal(weighted_const_iterator, traversal);
3543 23 Dec 16 peter 159   typename trait::weighted_iterator weighted_iterator;
3543 23 Dec 16 peter 160   test_access(weighted_iterator);
3543 23 Dec 16 peter 161   test_traversal(weighted_iterator, traversal);
3543 23 Dec 16 peter 162 }
3543 23 Dec 16 peter 163
3543 23 Dec 16 peter 164
3314 13 Sep 14 peter 165 int main(void)
3314 13 Sep 14 peter 166 {
3314 13 Sep 14 peter 167   // this is a compilation test - do not run
3314 13 Sep 14 peter 168   if (false) {
3579 16 Jan 17 peter 169     // On some systems std::iterator_traits<>::value_type does not
3579 16 Jan 17 peter 170     // work, so we require concept Data Iterator to be single pass.
3579 16 Jan 17 peter 171     //test1<boost::incrementable_traversal_tag>();
3314 13 Sep 14 peter 172     test1<boost::single_pass_traversal_tag>();
3314 13 Sep 14 peter 173     test1<boost::forward_traversal_tag>();
3314 13 Sep 14 peter 174     test1<boost::bidirectional_traversal_tag>();
3314 13 Sep 14 peter 175     test1<boost::random_access_traversal_tag>();
3543 23 Dec 16 peter 176
3543 23 Dec 16 peter 177     test2<boost::forward_traversal_tag>();
3543 23 Dec 16 peter 178     test2<boost::bidirectional_traversal_tag>();
3543 23 Dec 16 peter 179     test2<boost::random_access_traversal_tag>();
3314 13 Sep 14 peter 180   }
3314 13 Sep 14 peter 181
3314 13 Sep 14 peter 182   return 0;
3314 13 Sep 14 peter 183 }