// 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> >(); | |
// 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 |