concept_checks.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 215 行

HPP
215
字号
// 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 detail {namespace multi_array {  //  // 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 ];    }  };  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      idgen_helper<NumDims-1>::call(a,idgen[range],id);      // Test slicing, keeping all dimensions.      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;    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      idgen_helper<NumDims-1>::call(a,idgen[range],id);      // Test slicing, keeping all dimensions.      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      idgen_helper<NumDims-1>::call(a,idgen[range],id);      // Test slicing, keeping all dimensions.      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 boost#endif // BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?