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