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
 |