| 1 | namespace boost_concept{
|
|---|
| 2 | template < typename Iterator > struct ReadableIterator; template < typename Iterator > struct ReadableIteratorConcept : ReadableIterator< Iterator > { }; template < typename Iterator > struct ReadableIterato : boost::Assignable<Iterator , boost::CopyConstructible<Iterator
|
|---|
| 3 | {
|
|---|
| 4 | typedef typename boost::detail::iterator_traits<Iterator>::value_type value_type;
|
|---|
| 5 | typedef typename boost::detail::iterator_traits<Iterator>::reference reference;
|
|---|
| 6 |
|
|---|
| 7 | enum { boost_concept_check50 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<ReadableIterator>))0)) }; ~ReadableIterator()
|
|---|
| 8 | {
|
|---|
| 9 |
|
|---|
| 10 | value_type v = *i;
|
|---|
| 11 | boost::ignore_unused_variable_warning(v);
|
|---|
| 12 | }
|
|---|
| 13 | private Iterator i;
|
|---|
| 14 | };
|
|---|
| 15 | template typename Iterato , typename ValueType = typename boost::detail::iterator_traits<Iterator>::value_type
|
|---|
| 16 | struct WritableIterato : boost::CopyConstructible<Iterator {
|
|---|
| 17 | enum { boost_concept_check67 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<WritableIterator>))0)) }; ~WritableIterator()
|
|---|
| 18 | {
|
|---|
| 19 | *i = v;
|
|---|
| 20 | }
|
|---|
| 21 | private ValueType v;
|
|---|
| 22 | Iterator i;
|
|---|
| 23 | };
|
|---|
| 24 |
|
|---|
| 25 | template typename Iterato , typename ValueType = typename boost::detail::iterator_traits<Iterator>::value_type
|
|---|
| 26 | struct WritableIteratorConcept : WritableIterator<Iterator,ValueType> {};
|
|---|
| 27 | template < typename Iterator > struct SwappableIterator; template < typename Iterator > struct SwappableIteratorConcept : SwappableIterator< Iterator > { }; template < typename Iterator > struct SwappableIterato {
|
|---|
| 28 | enum { boost_concept_check84 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<SwappableIterator>))0)) }; ~SwappableIterator()
|
|---|
| 29 | {
|
|---|
| 30 | std::iter_swap(i1, i2);
|
|---|
| 31 | }
|
|---|
| 32 | private Iterator i1;
|
|---|
| 33 | Iterator i2;
|
|---|
| 34 | };
|
|---|
| 35 |
|
|---|
| 36 | template < typename Iterator > struct LvalueIterator; template < typename Iterator > struct LvalueIteratorConcept : LvalueIterator< Iterator > { }; template < typename Iterator > struct LvalueIterato {
|
|---|
| 37 | typedef typename boost::detail::iterator_traits<Iterator>::value_type value_type;
|
|---|
| 38 | enum { boost_concept_check97 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<LvalueIterator>))0)) }; ~LvalueIterator()
|
|---|
| 39 | {
|
|---|
| 40 | value_type& r = const_cast<value_type&>(*i);
|
|---|
| 41 | boost::ignore_unused_variable_warning(r);
|
|---|
| 42 | }
|
|---|
| 43 | private Iterator i;
|
|---|
| 44 | };
|
|---|
| 45 |
|
|---|
| 46 | template < typename Iterator > struct IncrementableIterator; template < typename Iterator > struct IncrementableIteratorConcept : IncrementableIterator< Iterator > { }; template < typename Iterator > struct IncrementableIterato : boost::Assignable<Iterator , boost::CopyConstructible<Iterator {
|
|---|
| 47 | typedef typename boost::iterator_traversal<Iterator>::type traversal_category;
|
|---|
| 48 |
|
|---|
| 49 | enum { boost_concept_check120 = sizeof(::boost::concept::require_((void(*)( boost::Convertible< traversal_category , boost::incrementable_traversal_tag >))0)) };
|
|---|
| 50 |
|
|---|
| 51 |
|
|---|
| 52 | enum { boost_concept_check122 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<IncrementableIterator>))0)) }; ~IncrementableIterator()
|
|---|
| 53 | {
|
|---|
| 54 | ++i;
|
|---|
| 55 | (void)i++;
|
|---|
| 56 | }
|
|---|
| 57 | private Iterator i;
|
|---|
| 58 | };
|
|---|
| 59 |
|
|---|
| 60 | template < typename Iterator > struct SinglePassIterator; template < typename Iterator > struct SinglePassIteratorConcept : SinglePassIterator< Iterator > { }; template < typename Iterator > struct SinglePassIterato : IncrementableIterator<Iterator , boost::EqualityComparable<Iterator
|
|---|
| 61 | {
|
|---|
| 62 | enum { boost_concept_check140 = sizeof(::boost::concept::require_((void(*)( boost::Convertible< typename SinglePassIterator::traversal_category , boost::single_pass_traversal_tag > ))0)) };
|
|---|
| 63 |
|
|---|
| 64 | };
|
|---|
| 65 |
|
|---|
| 66 | template < typename Iterator > struct ForwardTraversal; template < typename Iterator > struct ForwardTraversalConcept : ForwardTraversal< Iterator > { }; template < typename Iterator > struct ForwardTraversa : SinglePassIterator<Iterator , boost::DefaultConstructible<Iterator {
|
|---|
| 67 | typedef typename boost::detail::iterator_traits<Iterator>::difference_type difference_type;
|
|---|
| 68 | static const std::size_t mpl_assertion_in_line_14 = sizeof( boost::mpl::assertion_failed<false>( boost::mpl::assert_arg( (void (*) (boost::is_integral<difference_type>))0, 1 ) ) );
|
|---|
| 69 | static const std::size_t mpl_assertion_in_line_15 = sizeof( boost::mpl::assertion_failed<(std::numeric_limits<difference_type>::is_signed == true)>( (boost::mpl::failed ************ ( boost::mpl::assert_relation<std::numeric_limits<difference_type>::is_signed,true,(&boost::mpl::operator ==)>::************))0 ) );
|
|---|
| 70 |
|
|---|
| 71 | enum { boost_concept_check156 = sizeof(::boost::concept::require_((void(*)( boost::Convertible< typename ForwardTraversal::traversal_category , boost::forward_traversal_tag > ))0)) };
|
|---|
| 72 |
|
|---|
| 73 | };
|
|---|
| 74 | template < typename Iterator > struct BidirectionalTraversal; template < typename Iterator > struct BidirectionalTraversalConcept : BidirectionalTraversal< Iterator > { }; template < typename Iterator > struct BidirectionalTraversa : ForwardTraversal<Iterator {
|
|---|
| 75 | enum { boost_concept_check166 = sizeof(::boost::concept::require_((void(*)( boost::Convertible< typename BidirectionalTraversal::traversal_category , boost::bidirectional_traversal_tag > ))0)) };
|
|---|
| 76 |
|
|---|
| 77 |
|
|---|
| 78 | enum { boost_concept_check168 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<BidirectionalTraversal>))0)) }; ~BidirectionalTraversal()
|
|---|
| 79 | {
|
|---|
| 80 | --i;
|
|---|
| 81 | (void)i--;
|
|---|
| 82 | }
|
|---|
| 83 | private Iterator i;
|
|---|
| 84 | };
|
|---|
| 85 |
|
|---|
| 86 | template < typename Iterator > struct RandomAccessTraversal; template < typename Iterator > struct RandomAccessTraversalConcept : RandomAccessTraversal< Iterator > { }; template < typename Iterator > struct RandomAccessTraversa : BidirectionalTraversal<Iterator {
|
|---|
| 87 | enum { boost_concept_check184 = sizeof(::boost::concept::require_((void(*)( boost::Convertible< typename RandomAccessTraversal::traversal_category , boost::random_access_traversal_tag > ))0)) };
|
|---|
| 88 |
|
|---|
| 89 |
|
|---|
| 90 | enum { boost_concept_check186 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<RandomAccessTraversal>))0)) }; ~RandomAccessTraversal()
|
|---|
| 91 | {
|
|---|
| 92 | i += n;
|
|---|
| 93 | i = i + n;
|
|---|
| 94 | i = n + i;
|
|---|
| 95 | i -= n;
|
|---|
| 96 | i = i - n;
|
|---|
| 97 | n = i - j;
|
|---|
| 98 | }
|
|---|
| 99 | private typename BidirectionalTraversal<Iterator>::difference_type n;
|
|---|
| 100 | Iterator i, j;
|
|---|
| 101 | };
|
|---|
| 102 |
|
|---|
| 103 | namespace detai {
|
|---|
| 104 | template <typename Iterator1, typename Iterator2 void interop_single_pass_constraints(Iterator1 const& i1, Iterator2 const& i2)
|
|---|
| 105 | {
|
|---|
| 106 | bool b;
|
|---|
| 107 | b = i1 == i2;
|
|---|
| 108 | b = i1 != i2;
|
|---|
| 109 |
|
|---|
| 110 | b = i2 == i1;
|
|---|
| 111 | b = i2 != i1;
|
|---|
| 112 | boost::ignore_unused_variable_warning(b);
|
|---|
| 113 | }
|
|---|
| 114 |
|
|---|
| 115 | template <typename Iterator1, typename Iterator2 void interop_rand_access_constraints(
|
|---|
| 116 | Iterator1 const& i1, Iterator2 const& i2 boost::random_access_traversal_tag, boost::random_access_traversal_tag)
|
|---|
| 117 | {
|
|---|
| 118 | bool b;
|
|---|
| 119 | typename boost::detail::iterator_traits<Iterator2>::difference_type n;
|
|---|
| 120 | b = i1 < i2;
|
|---|
| 121 | b = i1 <= i2;
|
|---|
| 122 | b = i1 > i2;
|
|---|
| 123 | b = i1 >= i2;
|
|---|
| 124 | n = i1 - i2;
|
|---|
| 125 |
|
|---|
| 126 | b = i2 < i1;
|
|---|
| 127 | b = i2 <= i1;
|
|---|
| 128 | b = i2 > i1;
|
|---|
| 129 | b = i2 >= i1;
|
|---|
| 130 | n = i2 - i1;
|
|---|
| 131 | boost::ignore_unused_variable_warning(b);
|
|---|
| 132 | boost::ignore_unused_variable_warning(n);
|
|---|
| 133 | }
|
|---|
| 134 |
|
|---|
| 135 | template <typename Iterator1, typename Iterator2 void interop_rand_access_constraints(
|
|---|
| 136 | Iterator1 const&, Iterator2 const& boost::single_pass_traversal_tag, boost::single_pass_traversal_tag)
|
|---|
| 137 | { }
|
|---|
| 138 |
|
|---|
| 139 | }
|
|---|
| 140 | template < typename Iterator , typename ConstIterator > struct InteroperableIterator; template < typename Iterator , typename ConstIterator > struct InteroperableIteratorConcept : InteroperableIterator< Iterator, ConstIterator > { }; template < typename Iterator , typename ConstIterator > struct InteroperableIterato {
|
|---|
| 141 | private typedef typename boost::detail::pure_traversal_tag typename boost::iterator_traversal Iterato >::type
|
|---|
| 142 | >::type traversal_category;
|
|---|
| 143 |
|
|---|
| 144 | typedef typename boost::detail::pure_traversal_tag typename boost::iterator_traversal ConstIterato >::type
|
|---|
| 145 | >::type const_traversal_category;
|
|---|
| 146 | public enum { boost_concept_check264 = sizeof(::boost::concept::require_((void(*)(SinglePassIterator<Iterator>))0)) };
|
|---|
| 147 | enum { boost_concept_check265 = sizeof(::boost::concept::require_((void(*)(SinglePassIterator<ConstIterator>))0)) };
|
|---|
| 148 |
|
|---|
| 149 | enum { boost_concept_check267 = sizeof(::boost::concept::require_((void(*)(boost::concept::usage_requirements<InteroperableIterator>))0)) }; ~InteroperableIterator()
|
|---|
| 150 | {
|
|---|
| 151 | detail::interop_single_pass_constraints(i, ci);
|
|---|
| 152 | detail::interop_rand_access_constraints(i, ci, traversal_category(), const_traversal_category());
|
|---|
| 153 |
|
|---|
| 154 | ci = i;
|
|---|
| 155 | }
|
|---|
| 156 | private Iterator i;
|
|---|
| 157 | ConstIterator ci;
|
|---|
| 158 | };
|
|---|
| 159 |
|
|---|
| 160 | }
|
|---|
| 161 |
|
|---|
| 162 | namespace boost {
|
|---|
| 163 | namespace detail {
|
|---|
| 164 | namespace multi_array {
|
|---|
| 165 |
|
|---|
| 166 | template <std::size_t N struct idgen_helper {
|
|---|
| 167 |
|
|---|
| 168 | template <typename Array, typename IdxGen, typename Call_Type static void call(Array& a, const IdxGen& idgen, Call_Type c) {
|
|---|
| 169 | typedef typename Array::index_range index_range;
|
|---|
| 170 | typedef typename Array::index index;
|
|---|
| 171 | idgen_helper<N-1>::call(a,idgen[c],c);
|
|---|
| 172 | }
|
|---|
| 173 | };
|
|---|
| 174 |
|
|---|
| 175 | template < struct idgen_helper<0> {
|
|---|
| 176 |
|
|---|
| 177 | template <typename Array, typename IdxGen, typename Call_Type static void call(Array& a, const IdxGen& idgen, Call_Type) {
|
|---|
| 178 | typedef typename Array::index_range index_range;
|
|---|
| 179 | typedef typename Array::index index;
|
|---|
| 180 | a[ idgen ];
|
|---|
| 181 | }
|
|---|
| 182 | };
|
|---|
| 183 |
|
|---|
| 184 |
|
|---|
| 185 | template <typename Array, std::size_t NumDims struct ConstMultiArrayConcep {
|
|---|
| 186 | void constraints() {
|
|---|
| 187 | function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
|
|---|
| 188 | function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
|
|---|
| 189 | function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
|
|---|
| 190 | function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
|
|---|
| 191 |
|
|---|
| 192 | a[ id ];
|
|---|
| 193 | idgen_helper<NumDims-1>::call(a,idgen[range],id);
|
|---|
| 194 |
|
|---|
| 195 | idgen_helper<NumDims-1>::call(a,idgen[range],range);
|
|---|
| 196 |
|
|---|
| 197 | st = a.size();
|
|---|
| 198 | st = a.num_dimensions();
|
|---|
| 199 | st = Array::dimensionality;
|
|---|
| 200 | st = a.num_elements();
|
|---|
| 201 | stp = a.shape();
|
|---|
| 202 | idp = a.strides();
|
|---|
| 203 | idp = a.index_bases();
|
|---|
| 204 | cit = a.begin();
|
|---|
| 205 | cit = a.end();
|
|---|
| 206 | crit = a.rbegin();
|
|---|
| 207 | crit = a.rend();
|
|---|
| 208 | eltp = a.origin();
|
|---|
| 209 | }
|
|---|
| 210 |
|
|---|
| 211 | typedef typename Array::value_type value_type;
|
|---|
| 212 | typedef typename Array::reference reference;
|
|---|
| 213 | typedef typename Array::const_reference const_reference;
|
|---|
| 214 | typedef typename Array::size_type size_type;
|
|---|
| 215 | typedef typename Array::difference_type difference_type;
|
|---|
| 216 | typedef typename Array::iterator iterator;
|
|---|
| 217 | typedef typename Array::const_iterator const_iterator;
|
|---|
| 218 | typedef typename Array::reverse_iterator reverse_iterator;
|
|---|
| 219 | typedef typename Array::const_reverse_iterator const_reverse_iterator;
|
|---|
| 220 | typedef typename Array::element element;
|
|---|
| 221 | typedef typename Array::index index;
|
|---|
| 222 | typedef typename Array::index_gen index_gen;
|
|---|
| 223 | typedef typename Array::index_range index_range;
|
|---|
| 224 | typedef typename Array::extent_gen extent_gen;
|
|---|
| 225 | typedef typename Array::extent_range extent_range;
|
|---|
| 226 |
|
|---|
| 227 | Array a;
|
|---|
| 228 | size_type st;
|
|---|
| 229 | const size_type* stp;
|
|---|
| 230 | index id;
|
|---|
| 231 | const index* idp;
|
|---|
| 232 | const_iterator cit;
|
|---|
| 233 | const_reverse_iterator crit;
|
|---|
| 234 | const element* eltp;
|
|---|
| 235 | index_gen idgen;
|
|---|
| 236 | index_range range;
|
|---|
| 237 | };
|
|---|
| 238 |
|
|---|
| 239 |
|
|---|
| 240 | template <typename Array, std::size_t NumDims struct MutableMultiArrayConcep {
|
|---|
| 241 | void constraints() {
|
|---|
| 242 | function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
|
|---|
| 243 | function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
|
|---|
| 244 | function_requires< boost_concepts::WritableIteratorConcept<iterator> >();
|
|---|
| 245 | function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
|
|---|
| 246 | function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
|
|---|
| 247 | value_type vt = a[ id ];
|
|---|
| 248 |
|
|---|
| 249 | idgen_helper<NumDims-1>::call(a,idgen[range],id);
|
|---|
| 250 |
|
|---|
| 251 | idgen_helper<NumDims-1>::call(a,idgen[range],range);
|
|---|
| 252 |
|
|---|
| 253 | st = a.size();
|
|---|
| 254 | st = a.num_dimensions();
|
|---|
| 255 | st = a.num_elements();
|
|---|
| 256 | stp = a.shape();
|
|---|
| 257 | idp = a.strides();
|
|---|
| 258 | idp = a.index_bases();
|
|---|
| 259 | it = a.begin();
|
|---|
| 260 | it = a.end();
|
|---|
| 261 | rit = a.rbegin();
|
|---|
| 262 | rit = a.rend();
|
|---|
| 263 | eltp = a.origin();
|
|---|
| 264 | const_constraints(a);
|
|---|
| 265 | }
|
|---|
| 266 |
|
|---|
| 267 | void const_constraints(const Array& a) {
|
|---|
| 268 |
|
|---|
| 269 | idgen_helper<NumDims-1>::call(a,idgen[range],id);
|
|---|
| 270 |
|
|---|
| 271 | idgen_helper<NumDims-1>::call(a,idgen[range],range);
|
|---|
| 272 |
|
|---|
| 273 | st = a.size();
|
|---|
| 274 | st = a.num_dimensions();
|
|---|
| 275 | st = a.num_elements();
|
|---|
| 276 | stp = a.shape();
|
|---|
| 277 | idp = a.strides();
|
|---|
| 278 | idp = a.index_bases();
|
|---|
| 279 | cit = a.begin();
|
|---|
| 280 | cit = a.end();
|
|---|
| 281 | crit = a.rbegin();
|
|---|
| 282 | crit = a.rend();
|
|---|
| 283 | eltp = a.origin();
|
|---|
| 284 | }
|
|---|
| 285 |
|
|---|
| 286 | typedef typename Array::value_type value_type;
|
|---|
| 287 | typedef typename Array::reference reference;
|
|---|
| 288 | typedef typename Array::const_reference const_reference;
|
|---|
| 289 | typedef typename Array::size_type size_type;
|
|---|
| 290 | typedef typename Array::difference_type difference_type;
|
|---|
| 291 | typedef typename Array::iterator iterator;
|
|---|
| 292 | typedef typename Array::const_iterator const_iterator;
|
|---|
| 293 | typedef typename Array::reverse_iterator reverse_iterator;
|
|---|
| 294 | typedef typename Array::const_reverse_iterator const_reverse_iterator;
|
|---|
| 295 | typedef typename Array::element element;
|
|---|
| 296 | typedef typename Array::index index;
|
|---|
| 297 | typedef typename Array::index_gen index_gen;
|
|---|
| 298 | typedef typename Array::index_range index_range;
|
|---|
| 299 | typedef typename Array::extent_gen extent_gen;
|
|---|
| 300 | typedef typename Array::extent_range extent_range;
|
|---|
| 301 |
|
|---|
| 302 | Array a;
|
|---|
| 303 | size_type st;
|
|---|
| 304 | const size_type* stp;
|
|---|
| 305 | index id;
|
|---|
| 306 | const index* idp;
|
|---|
| 307 | iterator it;
|
|---|
| 308 | const_iterator cit;
|
|---|
| 309 | reverse_iterator rit;
|
|---|
| 310 | const_reverse_iterator crit;
|
|---|
| 311 | const element* eltp;
|
|---|
| 312 | index_gen idgen;
|
|---|
| 313 | index_range range;
|
|---|
| 314 | };
|
|---|
| 315 |
|
|---|
| 316 |
|
|---|
| 317 | }}}
|
|---|