Warning, file /include/boost/iterator/iterator_concepts.hpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006 #ifndef BOOST_ITERATOR_CONCEPTS_HPP
0007 #define BOOST_ITERATOR_CONCEPTS_HPP
0008
0009 #include <boost/concept_check.hpp>
0010 #include <boost/iterator/iterator_categories.hpp>
0011
0012 #include <type_traits>
0013
0014
0015 #include <boost/limits.hpp>
0016 #include <boost/config.hpp>
0017
0018 #include <algorithm>
0019 #include <iterator>
0020
0021 #include <boost/concept/detail/concept_def.hpp>
0022
0023 namespace boost_concepts
0024 {
0025
0026
0027
0028
0029
0030
0031
0032 BOOST_concept(ReadableIterator,(Iterator))
0033 : boost::Assignable<Iterator>
0034 , boost::CopyConstructible<Iterator>
0035
0036 {
0037 typedef BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::value_type value_type;
0038 typedef BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::reference reference;
0039
0040 BOOST_CONCEPT_USAGE(ReadableIterator)
0041 {
0042
0043 value_type v = *i;
0044 boost::ignore_unused_variable_warning(v);
0045 }
0046 private:
0047 Iterator i;
0048 };
0049
0050 template <
0051 typename Iterator
0052 , typename ValueType = BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::value_type
0053 >
0054 struct WritableIterator
0055 : boost::CopyConstructible<Iterator>
0056 {
0057 BOOST_CONCEPT_USAGE(WritableIterator)
0058 {
0059 *i = v;
0060 }
0061 private:
0062 ValueType v;
0063 Iterator i;
0064 };
0065
0066 template <
0067 typename Iterator
0068 , typename ValueType = BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::value_type
0069 >
0070 struct WritableIteratorConcept : WritableIterator<Iterator,ValueType> {};
0071
0072 BOOST_concept(SwappableIterator,(Iterator))
0073 {
0074 BOOST_CONCEPT_USAGE(SwappableIterator)
0075 {
0076 std::iter_swap(i1, i2);
0077 }
0078 private:
0079 Iterator i1;
0080 Iterator i2;
0081 };
0082
0083 BOOST_concept(LvalueIterator,(Iterator))
0084 {
0085 typedef typename std::iterator_traits<Iterator>::value_type value_type;
0086
0087 BOOST_CONCEPT_USAGE(LvalueIterator)
0088 {
0089 value_type& r = const_cast<value_type&>(*i);
0090 boost::ignore_unused_variable_warning(r);
0091 }
0092 private:
0093 Iterator i;
0094 };
0095
0096
0097
0098
0099
0100 BOOST_concept(IncrementableIterator,(Iterator))
0101 : boost::Assignable<Iterator>
0102 , boost::CopyConstructible<Iterator>
0103 {
0104 typedef typename boost::iterator_traversal<Iterator>::type traversal_category;
0105
0106 BOOST_CONCEPT_ASSERT((
0107 boost::Convertible<
0108 traversal_category
0109 , boost::incrementable_traversal_tag
0110 >));
0111
0112 BOOST_CONCEPT_USAGE(IncrementableIterator)
0113 {
0114 ++i;
0115 (void)i++;
0116 }
0117 private:
0118 Iterator i;
0119 };
0120
0121 BOOST_concept(SinglePassIterator,(Iterator))
0122 : IncrementableIterator<Iterator>
0123 , boost::EqualityComparable<Iterator>
0124
0125 {
0126 BOOST_CONCEPT_ASSERT((
0127 boost::Convertible<
0128 BOOST_DEDUCED_TYPENAME SinglePassIterator::traversal_category
0129 , boost::single_pass_traversal_tag
0130 > ));
0131 };
0132
0133 BOOST_concept(ForwardTraversal,(Iterator))
0134 : SinglePassIterator<Iterator>
0135 , boost::DefaultConstructible<Iterator>
0136 {
0137 typedef typename std::iterator_traits<Iterator>::difference_type difference_type;
0138
0139 static_assert(std::is_integral<difference_type>::value, "difference_type must be integral.");
0140 static_assert(std::numeric_limits<difference_type>::is_signed, "difference_type must be signed.");
0141
0142 BOOST_CONCEPT_ASSERT((
0143 boost::Convertible<
0144 BOOST_DEDUCED_TYPENAME ForwardTraversal::traversal_category
0145 , boost::forward_traversal_tag
0146 > ));
0147 };
0148
0149 BOOST_concept(BidirectionalTraversal,(Iterator))
0150 : ForwardTraversal<Iterator>
0151 {
0152 BOOST_CONCEPT_ASSERT((
0153 boost::Convertible<
0154 BOOST_DEDUCED_TYPENAME BidirectionalTraversal::traversal_category
0155 , boost::bidirectional_traversal_tag
0156 > ));
0157
0158 BOOST_CONCEPT_USAGE(BidirectionalTraversal)
0159 {
0160 --i;
0161 (void)i--;
0162 }
0163 private:
0164 Iterator i;
0165 };
0166
0167 BOOST_concept(RandomAccessTraversal,(Iterator))
0168 : BidirectionalTraversal<Iterator>
0169 {
0170 BOOST_CONCEPT_ASSERT((
0171 boost::Convertible<
0172 BOOST_DEDUCED_TYPENAME RandomAccessTraversal::traversal_category
0173 , boost::random_access_traversal_tag
0174 > ));
0175
0176 BOOST_CONCEPT_USAGE(RandomAccessTraversal)
0177 {
0178 i += n;
0179 i = i + n;
0180 i = n + i;
0181 i -= n;
0182 i = i - n;
0183 n = i - j;
0184 }
0185
0186 private:
0187 typename BidirectionalTraversal<Iterator>::difference_type n;
0188 Iterator i, j;
0189 };
0190
0191
0192
0193
0194 namespace detail
0195 {
0196 template <typename Iterator1, typename Iterator2>
0197 void interop_single_pass_constraints(Iterator1 const& i1, Iterator2 const& i2)
0198 {
0199 bool b;
0200 b = i1 == i2;
0201 b = i1 != i2;
0202
0203 b = i2 == i1;
0204 b = i2 != i1;
0205 boost::ignore_unused_variable_warning(b);
0206 }
0207
0208 template <typename Iterator1, typename Iterator2>
0209 void interop_rand_access_constraints(
0210 Iterator1 const& i1, Iterator2 const& i2,
0211 boost::random_access_traversal_tag, boost::random_access_traversal_tag)
0212 {
0213 bool b;
0214 typename std::iterator_traits<Iterator2>::difference_type n;
0215 b = i1 < i2;
0216 b = i1 <= i2;
0217 b = i1 > i2;
0218 b = i1 >= i2;
0219 n = i1 - i2;
0220
0221 b = i2 < i1;
0222 b = i2 <= i1;
0223 b = i2 > i1;
0224 b = i2 >= i1;
0225 n = i2 - i1;
0226 boost::ignore_unused_variable_warning(b);
0227 boost::ignore_unused_variable_warning(n);
0228 }
0229
0230 template <typename Iterator1, typename Iterator2>
0231 void interop_rand_access_constraints(
0232 Iterator1 const&, Iterator2 const&,
0233 boost::single_pass_traversal_tag, boost::single_pass_traversal_tag)
0234 { }
0235
0236 }
0237
0238 BOOST_concept(InteroperableIterator,(Iterator)(ConstIterator))
0239 {
0240 private:
0241 typedef typename boost::iterators::pure_iterator_traversal<Iterator>::type traversal_category;
0242 typedef typename boost::iterators::pure_iterator_traversal<ConstIterator>::type const_traversal_category;
0243
0244 public:
0245 BOOST_CONCEPT_ASSERT((SinglePassIterator<Iterator>));
0246 BOOST_CONCEPT_ASSERT((SinglePassIterator<ConstIterator>));
0247
0248 BOOST_CONCEPT_USAGE(InteroperableIterator)
0249 {
0250 detail::interop_single_pass_constraints(i, ci);
0251 detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category());
0252
0253 ci = i;
0254 }
0255
0256 private:
0257 Iterator i;
0258 ConstIterator ci;
0259 };
0260
0261 }
0262
0263 #include <boost/concept/detail/concept_undef.hpp>
0264
0265 #endif