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 |