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
							 |