You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
224 lines
7.1 KiB
224 lines
7.1 KiB
// 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
|
|
|