File indexing completed on 2025-09-17 08:50:05
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef BOOST_RANGE_CONCEPTS_HPP
0017 #define BOOST_RANGE_CONCEPTS_HPP
0018
0019 #include <boost/concept_check.hpp>
0020 #include <boost/iterator/iterator_concepts.hpp>
0021 #include <boost/range/begin.hpp>
0022 #include <boost/range/end.hpp>
0023 #include <boost/range/iterator.hpp>
0024 #include <boost/range/value_type.hpp>
0025 #include <boost/range/detail/misc_concept.hpp>
0026 #include <boost/mpl/assert.hpp>
0027 #include <boost/type_traits/remove_reference.hpp>
0028 #include <boost/type_traits/is_integral.hpp>
0029
0030 #include <iterator>
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064 namespace boost {
0065
0066 namespace range_detail {
0067
0068 #ifndef BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0069
0070
0071 #ifndef __clang__
0072 #ifdef __GNUC__
0073
0074
0075
0076 #if __GNUC__ == 4 && __GNUC_MINOR__ == 2
0077 #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
0078 #endif
0079 #endif
0080
0081 #ifdef __GCCXML__
0082
0083 #if __GCCXML_GNUC__ == 4 && __GCCXML_GNUC_MINOR__ == 2
0084 #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
0085 #endif
0086 #endif
0087 #endif
0088
0089 #ifdef BOOST_BORLANDC
0090 #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
0091 #endif
0092
0093 #ifdef __PATHCC__
0094 #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
0095 #endif
0096
0097
0098
0099 #ifndef BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0100 #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 1
0101 #endif
0102
0103 #endif
0104
0105 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0106 #define BOOST_RANGE_CONCEPT_ASSERT( x ) BOOST_CONCEPT_ASSERT( x )
0107 #else
0108 #define BOOST_RANGE_CONCEPT_ASSERT( x )
0109 #endif
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126 template<class Iterator>
0127 struct IncrementableIteratorConcept : CopyConstructible<Iterator>
0128 {
0129 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0130 typedef BOOST_DEDUCED_TYPENAME iterator_traversal<Iterator>::type traversal_category;
0131
0132 BOOST_RANGE_CONCEPT_ASSERT((
0133 Convertible<
0134 traversal_category,
0135 incrementable_traversal_tag
0136 >));
0137
0138 BOOST_CONCEPT_USAGE(IncrementableIteratorConcept)
0139 {
0140 ++i;
0141 (void)i++;
0142 }
0143 private:
0144 Iterator i;
0145 #endif
0146 };
0147
0148 template<class Iterator>
0149 struct SinglePassIteratorConcept
0150 : IncrementableIteratorConcept<Iterator>
0151 , EqualityComparable<Iterator>
0152 {
0153 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0154 BOOST_RANGE_CONCEPT_ASSERT((
0155 Convertible<
0156 BOOST_DEDUCED_TYPENAME SinglePassIteratorConcept::traversal_category,
0157 single_pass_traversal_tag
0158 >));
0159
0160 BOOST_CONCEPT_USAGE(SinglePassIteratorConcept)
0161 {
0162 Iterator i2(++i);
0163 boost::ignore_unused_variable_warning(i2);
0164
0165
0166
0167
0168
0169 (void)(i++);
0170
0171 BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::reference r1(*i);
0172 boost::ignore_unused_variable_warning(r1);
0173
0174 BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::reference r2(*(++i));
0175 boost::ignore_unused_variable_warning(r2);
0176 }
0177 private:
0178 Iterator i;
0179 #endif
0180 };
0181
0182 template<class Iterator>
0183 struct ForwardIteratorConcept
0184 : SinglePassIteratorConcept<Iterator>
0185 , DefaultConstructible<Iterator>
0186 {
0187 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0188 typedef BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::difference_type difference_type;
0189
0190 BOOST_MPL_ASSERT((is_integral<difference_type>));
0191 BOOST_MPL_ASSERT_RELATION(std::numeric_limits<difference_type>::is_signed, ==, true);
0192
0193 BOOST_RANGE_CONCEPT_ASSERT((
0194 Convertible<
0195 BOOST_DEDUCED_TYPENAME ForwardIteratorConcept::traversal_category,
0196 forward_traversal_tag
0197 >));
0198
0199 BOOST_CONCEPT_USAGE(ForwardIteratorConcept)
0200 {
0201
0202
0203
0204
0205 Iterator i2(i++);
0206 boost::ignore_unused_variable_warning(i2);
0207 BOOST_DEDUCED_TYPENAME std::iterator_traits<Iterator>::reference r(*(i++));
0208 boost::ignore_unused_variable_warning(r);
0209 }
0210 private:
0211 Iterator i;
0212 #endif
0213 };
0214
0215 template<class Iterator>
0216 struct BidirectionalIteratorConcept
0217 : ForwardIteratorConcept<Iterator>
0218 {
0219 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0220 BOOST_RANGE_CONCEPT_ASSERT((
0221 Convertible<
0222 BOOST_DEDUCED_TYPENAME BidirectionalIteratorConcept::traversal_category,
0223 bidirectional_traversal_tag
0224 >));
0225
0226 BOOST_CONCEPT_USAGE(BidirectionalIteratorConcept)
0227 {
0228 --i;
0229 (void)i--;
0230 }
0231 private:
0232 Iterator i;
0233 #endif
0234 };
0235
0236 template<class Iterator>
0237 struct RandomAccessIteratorConcept
0238 : BidirectionalIteratorConcept<Iterator>
0239 {
0240 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0241 BOOST_RANGE_CONCEPT_ASSERT((
0242 Convertible<
0243 BOOST_DEDUCED_TYPENAME RandomAccessIteratorConcept::traversal_category,
0244 random_access_traversal_tag
0245 >));
0246
0247 BOOST_CONCEPT_USAGE(RandomAccessIteratorConcept)
0248 {
0249 i += n;
0250 i = i + n;
0251 i = n + i;
0252 i -= n;
0253 i = i - n;
0254 n = i - j;
0255 }
0256 private:
0257 BOOST_DEDUCED_TYPENAME BidirectionalIteratorConcept<Iterator>::difference_type n;
0258 Iterator i;
0259 Iterator j;
0260 #endif
0261 };
0262
0263 }
0264
0265
0266 template<class T>
0267 struct SinglePassRangeConcept
0268 {
0269 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0270
0271
0272 typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type Rng;
0273
0274 typedef BOOST_DEDUCED_TYPENAME range_iterator<
0275 Rng const
0276 >::type const_iterator;
0277
0278 typedef BOOST_DEDUCED_TYPENAME range_iterator<Rng>::type iterator;
0279
0280 BOOST_RANGE_CONCEPT_ASSERT((
0281 range_detail::SinglePassIteratorConcept<iterator>));
0282
0283 BOOST_RANGE_CONCEPT_ASSERT((
0284 range_detail::SinglePassIteratorConcept<const_iterator>));
0285
0286 BOOST_CONCEPT_USAGE(SinglePassRangeConcept)
0287 {
0288
0289
0290
0291 iterator i1 = boost::begin(*m_range);
0292 iterator i2 = boost::end(*m_range);
0293
0294 boost::ignore_unused_variable_warning(i1);
0295 boost::ignore_unused_variable_warning(i2);
0296
0297 const_constraints(*m_range);
0298 }
0299
0300 private:
0301 void const_constraints(const Rng& const_range)
0302 {
0303 const_iterator ci1 = boost::begin(const_range);
0304 const_iterator ci2 = boost::end(const_range);
0305
0306 boost::ignore_unused_variable_warning(ci1);
0307 boost::ignore_unused_variable_warning(ci2);
0308 }
0309
0310
0311
0312
0313
0314 Rng* m_range;
0315 #endif
0316 };
0317
0318
0319 template<class T>
0320 struct ForwardRangeConcept : SinglePassRangeConcept<T>
0321 {
0322 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0323 BOOST_RANGE_CONCEPT_ASSERT((range_detail::ForwardIteratorConcept<BOOST_DEDUCED_TYPENAME ForwardRangeConcept::iterator>));
0324 BOOST_RANGE_CONCEPT_ASSERT((range_detail::ForwardIteratorConcept<BOOST_DEDUCED_TYPENAME ForwardRangeConcept::const_iterator>));
0325 #endif
0326 };
0327
0328 template<class T>
0329 struct WriteableRangeConcept
0330 {
0331 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0332 typedef BOOST_DEDUCED_TYPENAME range_iterator<T>::type iterator;
0333
0334 BOOST_CONCEPT_USAGE(WriteableRangeConcept)
0335 {
0336 *i = v;
0337 }
0338 private:
0339 iterator i;
0340 BOOST_DEDUCED_TYPENAME range_value<T>::type v;
0341 #endif
0342 };
0343
0344
0345 template<class T>
0346 struct WriteableForwardRangeConcept
0347 : ForwardRangeConcept<T>
0348 , WriteableRangeConcept<T>
0349 {
0350 };
0351
0352
0353 template<class T>
0354 struct BidirectionalRangeConcept : ForwardRangeConcept<T>
0355 {
0356 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0357 BOOST_RANGE_CONCEPT_ASSERT((range_detail::BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::iterator>));
0358 BOOST_RANGE_CONCEPT_ASSERT((range_detail::BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::const_iterator>));
0359 #endif
0360 };
0361
0362
0363 template<class T>
0364 struct WriteableBidirectionalRangeConcept
0365 : BidirectionalRangeConcept<T>
0366 , WriteableRangeConcept<T>
0367 {
0368 };
0369
0370
0371 template<class T>
0372 struct RandomAccessRangeConcept : BidirectionalRangeConcept<T>
0373 {
0374 #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
0375 BOOST_RANGE_CONCEPT_ASSERT((range_detail::RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::iterator>));
0376 BOOST_RANGE_CONCEPT_ASSERT((range_detail::RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::const_iterator>));
0377 #endif
0378 };
0379
0380
0381 template<class T>
0382 struct WriteableRandomAccessRangeConcept
0383 : RandomAccessRangeConcept<T>
0384 , WriteableRangeConcept<T>
0385 {
0386 };
0387
0388 }
0389
0390 #endif