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