Chris@16: // Copyright 2002 The Trustees of Indiana University. Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software Chris@16: // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // Boost.MultiArray Library Chris@16: // Authors: Ronald Garcia Chris@16: // Jeremy Siek Chris@16: // Andrew Lumsdaine Chris@16: // See http://www.boost.org/libs/multi_array for documentation. Chris@16: Chris@16: #ifndef BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP Chris@16: #define BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP Chris@16: Chris@16: // Chris@16: // concept-checks.hpp - Checks out Const MultiArray and MultiArray Chris@16: // concepts Chris@16: // Chris@16: Chris@16: #include "boost/concept_check.hpp" Chris@16: #include "boost/iterator/iterator_concepts.hpp" Chris@16: Chris@16: namespace boost { Chris@16: namespace multi_array_concepts { Chris@16: Chris@16: namespace detail { Chris@16: // Chris@16: // idgen_helper - Chris@16: // This is a helper for generating index_gen instantiations with Chris@16: // the right type in order to test the call to Chris@16: // operator[](index_gen). Since one would normally write: Chris@16: // A[ indices[range1][range2] ]; // or Chris@16: // B[ indices[index1][index2][range1] ]; Chris@16: // idgen helper allows us to generate the "indices" type by Chris@16: // creating it through recursive calls. Chris@16: template Chris@16: struct idgen_helper { Chris@16: Chris@16: template Chris@16: static void call(Array& a, const IdxGen& idgen, Call_Type c) { Chris@16: typedef typename Array::index_range index_range; Chris@16: typedef typename Array::index index; Chris@16: idgen_helper::call(a,idgen[c],c); Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct idgen_helper<0> { Chris@16: Chris@16: template Chris@16: static void call(Array& a, const IdxGen& idgen, Call_Type) { Chris@16: typedef typename Array::index_range index_range; Chris@16: typedef typename Array::index index; Chris@16: a[ idgen ]; Chris@16: } Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: Chris@16: template Chris@16: struct ConstMultiArrayConcept Chris@16: { Chris@16: void constraints() { Chris@16: // function_requires< CopyConstructibleConcept >(); Chris@16: function_requires< boost_concepts::ForwardTraversalConcept >(); Chris@16: function_requires< boost_concepts::ReadableIteratorConcept >(); Chris@16: function_requires< boost_concepts::ForwardTraversalConcept >(); Chris@16: function_requires< boost_concepts::ReadableIteratorConcept >(); Chris@16: Chris@16: // RG - a( CollectionArchetype) when available... Chris@16: a[ id ]; Chris@16: // Test slicing, keeping only the first dimension, losing the rest Chris@16: detail::idgen_helper::call(a,idgen[range],id); Chris@16: Chris@16: // Test slicing, keeping all dimensions. Chris@16: detail::idgen_helper::call(a,idgen[range],range); Chris@16: Chris@16: st = a.size(); Chris@16: st = a.num_dimensions(); Chris@16: st = Array::dimensionality; Chris@16: st = a.num_elements(); Chris@16: stp = a.shape(); Chris@16: idp = a.strides(); Chris@16: idp = a.index_bases(); Chris@16: cit = a.begin(); Chris@16: cit = a.end(); Chris@16: crit = a.rbegin(); Chris@16: crit = a.rend(); Chris@16: eltp = a.origin(); Chris@16: } Chris@16: Chris@16: typedef typename Array::value_type value_type; Chris@16: typedef typename Array::reference reference; Chris@16: typedef typename Array::const_reference const_reference; Chris@16: typedef typename Array::size_type size_type; Chris@16: typedef typename Array::difference_type difference_type; Chris@16: typedef typename Array::iterator iterator; Chris@16: typedef typename Array::const_iterator const_iterator; Chris@16: typedef typename Array::reverse_iterator reverse_iterator; Chris@16: typedef typename Array::const_reverse_iterator const_reverse_iterator; Chris@16: typedef typename Array::element element; Chris@16: typedef typename Array::index index; Chris@16: typedef typename Array::index_gen index_gen; Chris@16: typedef typename Array::index_range index_range; Chris@16: typedef typename Array::extent_gen extent_gen; Chris@16: typedef typename Array::extent_range extent_range; Chris@16: Chris@16: Array a; Chris@16: size_type st; Chris@16: const size_type* stp; Chris@16: index id; Chris@16: const index* idp; Chris@16: const_iterator cit; Chris@16: const_reverse_iterator crit; Chris@16: const element* eltp; Chris@16: index_gen idgen; Chris@16: index_range range; Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct MutableMultiArrayConcept Chris@16: { Chris@16: void constraints() { Chris@16: // function_requires< CopyConstructibleConcept >(); Chris@16: Chris@16: function_requires< boost_concepts::ForwardTraversalConcept >(); Chris@16: function_requires< boost_concepts::ReadableIteratorConcept >(); Chris@16: function_requires< boost_concepts::WritableIteratorConcept >(); Chris@16: function_requires< boost_concepts::ForwardTraversalConcept >(); Chris@16: function_requires< boost_concepts::ReadableIteratorConcept >(); Chris@16: function_requires< boost::OutputIterator >(); Chris@16: Chris@16: // RG - a( CollectionArchetype) when available... Chris@16: value_type vt = a[ id ]; Chris@16: Chris@16: // Test slicing, keeping only the first dimension, losing the rest Chris@16: detail::idgen_helper::call(a,idgen[range],id); Chris@16: Chris@16: // Test slicing, keeping all dimensions. Chris@16: detail::idgen_helper::call(a,idgen[range],range); Chris@16: Chris@16: st = a.size(); Chris@16: st = a.num_dimensions(); Chris@16: st = a.num_elements(); Chris@16: stp = a.shape(); Chris@16: idp = a.strides(); Chris@16: idp = a.index_bases(); Chris@16: it = a.begin(); Chris@16: it = a.end(); Chris@16: rit = a.rbegin(); Chris@16: rit = a.rend(); Chris@16: eltp = a.origin(); Chris@16: const_constraints(a); Chris@16: } Chris@16: Chris@16: void const_constraints(const Array& a) { Chris@16: Chris@16: // value_type vt = a[ id ]; Chris@16: Chris@16: // Test slicing, keeping only the first dimension, losing the rest Chris@16: detail::idgen_helper::call(a,idgen[range],id); Chris@16: Chris@16: // Test slicing, keeping all dimensions. Chris@16: detail::idgen_helper::call(a,idgen[range],range); Chris@16: Chris@16: st = a.size(); Chris@16: st = a.num_dimensions(); Chris@16: st = a.num_elements(); Chris@16: stp = a.shape(); Chris@16: idp = a.strides(); Chris@16: idp = a.index_bases(); Chris@16: cit = a.begin(); Chris@16: cit = a.end(); Chris@16: crit = a.rbegin(); Chris@16: crit = a.rend(); Chris@16: eltp = a.origin(); Chris@16: } Chris@16: Chris@16: typedef typename Array::value_type value_type; Chris@16: typedef typename Array::reference reference; Chris@16: typedef typename Array::const_reference const_reference; Chris@16: typedef typename Array::size_type size_type; Chris@16: typedef typename Array::difference_type difference_type; Chris@16: typedef typename Array::iterator iterator; Chris@16: typedef typename Array::const_iterator const_iterator; Chris@16: typedef typename Array::reverse_iterator reverse_iterator; Chris@16: typedef typename Array::const_reverse_iterator const_reverse_iterator; Chris@16: typedef typename Array::element element; Chris@16: typedef typename Array::index index; Chris@16: typedef typename Array::index_gen index_gen; Chris@16: typedef typename Array::index_range index_range; Chris@16: typedef typename Array::extent_gen extent_gen; Chris@16: typedef typename Array::extent_range extent_range; Chris@16: Chris@16: Array a; Chris@16: size_type st; Chris@16: const size_type* stp; Chris@16: index id; Chris@16: const index* idp; Chris@16: iterator it; Chris@16: const_iterator cit; Chris@16: reverse_iterator rit; Chris@16: const_reverse_iterator crit; Chris@16: const element* eltp; Chris@16: index_gen idgen; Chris@16: index_range range; Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace multi_array Chris@16: Chris@16: namespace detail { Chris@16: namespace multi_array { // Old locations for these Chris@16: using boost::multi_array_concepts::ConstMultiArrayConcept; Chris@16: using boost::multi_array_concepts::MutableMultiArrayConcept; Chris@16: } Chris@16: } Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: #endif // BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP