Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/multi_array/concept_checks.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/multi_array/concept_checks.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,225 @@ +// 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