3314 |
13 Sep 14 |
peter |
// $Id$ |
3314 |
13 Sep 14 |
peter |
2 |
|
3314 |
13 Sep 14 |
peter |
3 |
/* |
3579 |
16 Jan 17 |
peter |
Copyright (C) 2014, 2015, 2016, 2017 Peter Johansson |
3314 |
13 Sep 14 |
peter |
5 |
|
3314 |
13 Sep 14 |
peter |
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 |
The yat library is free software; you can redistribute it and/or |
3314 |
13 Sep 14 |
peter |
modify it under the terms of the GNU General Public License as |
3314 |
13 Sep 14 |
peter |
published by the Free Software Foundation; either version 3 of the |
3314 |
13 Sep 14 |
peter |
License, or (at your option) any later version. |
3314 |
13 Sep 14 |
peter |
12 |
|
3314 |
13 Sep 14 |
peter |
The yat library is distributed in the hope that it will be useful, |
3314 |
13 Sep 14 |
peter |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
3314 |
13 Sep 14 |
peter |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
3314 |
13 Sep 14 |
peter |
General Public License for more details. |
3314 |
13 Sep 14 |
peter |
17 |
|
3314 |
13 Sep 14 |
peter |
You should have received a copy of the GNU General Public License |
3314 |
13 Sep 14 |
peter |
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 |
// Test that class utility::WeightedIteratorArchetype works as |
3314 |
13 Sep 14 |
peter |
// intended. If the class does not work on a system (and this test |
3314 |
13 Sep 14 |
peter |
// fails), it probably cause many other failures and it probably a |
3314 |
13 Sep 14 |
peter |
// good idea to fix this test first before the other failures (which |
3314 |
13 Sep 14 |
peter |
// 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 |
// 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 |
// this is a compilation test - do not run |
3314 |
13 Sep 14 |
peter |
168 |
if (false) { |
3579 |
16 Jan 17 |
peter |
// On some systems std::iterator_traits<>::value_type does not |
3579 |
16 Jan 17 |
peter |
// work, so we require concept Data Iterator to be single pass. |
3579 |
16 Jan 17 |
peter |
//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 |
} |