epoc32/include/stdapis/boost/multi_array/concept_checks.hpp
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
williamr@2
     1
// Copyright 2002 The Trustees of Indiana University.
williamr@2
     2
williamr@2
     3
// Use, modification and distribution is subject to the Boost Software 
williamr@2
     4
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
williamr@2
     5
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     6
williamr@2
     7
//  Boost.MultiArray Library
williamr@2
     8
//  Authors: Ronald Garcia
williamr@2
     9
//           Jeremy Siek
williamr@2
    10
//           Andrew Lumsdaine
williamr@2
    11
//  See http://www.boost.org/libs/multi_array for documentation.
williamr@2
    12
williamr@2
    13
#ifndef BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
williamr@2
    14
#define BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP
williamr@2
    15
williamr@2
    16
//
williamr@2
    17
// concept-checks.hpp - Checks out Const MultiArray and MultiArray
williamr@2
    18
// concepts
williamr@2
    19
//
williamr@2
    20
williamr@2
    21
#include "boost/concept_check.hpp"
williamr@2
    22
#include "boost/iterator/iterator_concepts.hpp"
williamr@2
    23
williamr@2
    24
namespace boost {
williamr@2
    25
namespace detail {
williamr@2
    26
namespace multi_array {
williamr@2
    27
williamr@2
    28
  //
williamr@2
    29
  // idgen_helper -
williamr@2
    30
  //   This is a helper for generating index_gen instantiations with
williamr@2
    31
  //   the right type in order to test the call to
williamr@2
    32
  //   operator[](index_gen).  Since one would normally write:
williamr@2
    33
  //      A[ indices[range1][range2] ]; // or
williamr@2
    34
  //      B[ indices[index1][index2][range1] ];
williamr@2
    35
  //   idgen helper allows us to generate the "indices" type by
williamr@2
    36
  //   creating it through recursive calls.
williamr@2
    37
  template <std::size_t N>
williamr@2
    38
  struct idgen_helper {
williamr@2
    39
williamr@2
    40
    template <typename Array, typename IdxGen, typename Call_Type>
williamr@2
    41
    static void call(Array& a, const IdxGen& idgen, Call_Type c) {
williamr@2
    42
      typedef typename Array::index_range index_range;
williamr@2
    43
      typedef typename Array::index index;
williamr@2
    44
      idgen_helper<N-1>::call(a,idgen[c],c);
williamr@2
    45
    }
williamr@2
    46
  };
williamr@2
    47
williamr@2
    48
  template <>
williamr@2
    49
  struct idgen_helper<0> {
williamr@2
    50
williamr@2
    51
    template <typename Array, typename IdxGen, typename Call_Type>
williamr@2
    52
    static void call(Array& a, const IdxGen& idgen, Call_Type) {
williamr@2
    53
      typedef typename Array::index_range index_range;
williamr@2
    54
      typedef typename Array::index index;
williamr@2
    55
      a[ idgen ];
williamr@2
    56
    }
williamr@2
    57
  };
williamr@2
    58
williamr@2
    59
williamr@2
    60
  template <typename Array, std::size_t NumDims >
williamr@2
    61
  struct ConstMultiArrayConcept
williamr@2
    62
  {
williamr@2
    63
    void constraints() {
williamr@2
    64
    //    function_requires< CopyConstructibleConcept<Array> >();
williamr@2
    65
    function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
williamr@2
    66
    function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
williamr@2
    67
    function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
williamr@2
    68
    function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
williamr@2
    69
williamr@2
    70
      // RG - a( CollectionArchetype) when available...
williamr@2
    71
      a[ id ];
williamr@2
    72
      // Test slicing, keeping only the first dimension, losing the rest
williamr@2
    73
      idgen_helper<NumDims-1>::call(a,idgen[range],id);
williamr@2
    74
williamr@2
    75
      // Test slicing, keeping all dimensions.
williamr@2
    76
      idgen_helper<NumDims-1>::call(a,idgen[range],range);
williamr@2
    77
williamr@2
    78
      st = a.size();
williamr@2
    79
      st = a.num_dimensions();
williamr@2
    80
      st = a.num_elements();
williamr@2
    81
      stp = a.shape();
williamr@2
    82
      idp = a.strides();
williamr@2
    83
      idp = a.index_bases();
williamr@2
    84
      cit = a.begin();
williamr@2
    85
      cit = a.end();
williamr@2
    86
      crit = a.rbegin();
williamr@2
    87
      crit = a.rend();
williamr@2
    88
      eltp = a.origin();
williamr@2
    89
    }
williamr@2
    90
williamr@2
    91
    typedef typename Array::value_type value_type;
williamr@2
    92
    typedef typename Array::reference reference;
williamr@2
    93
    typedef typename Array::const_reference const_reference;
williamr@2
    94
    typedef typename Array::size_type size_type;
williamr@2
    95
    typedef typename Array::difference_type difference_type;
williamr@2
    96
    typedef typename Array::iterator iterator;
williamr@2
    97
    typedef typename Array::const_iterator const_iterator;
williamr@2
    98
    typedef typename Array::reverse_iterator reverse_iterator;
williamr@2
    99
    typedef typename Array::const_reverse_iterator const_reverse_iterator;
williamr@2
   100
    typedef typename Array::element element;
williamr@2
   101
    typedef typename Array::index index;
williamr@2
   102
    typedef typename Array::index_gen index_gen;
williamr@2
   103
    typedef typename Array::index_range index_range;
williamr@2
   104
    typedef typename Array::extent_gen extent_gen;
williamr@2
   105
    typedef typename Array::extent_range extent_range;
williamr@2
   106
williamr@2
   107
    Array a;
williamr@2
   108
    size_type st;
williamr@2
   109
    const size_type* stp;
williamr@2
   110
    index id;
williamr@2
   111
    const index* idp;
williamr@2
   112
    const_iterator cit;
williamr@2
   113
    const_reverse_iterator crit;
williamr@2
   114
    const element* eltp;
williamr@2
   115
    index_gen idgen;
williamr@2
   116
    index_range range;
williamr@2
   117
  };
williamr@2
   118
williamr@2
   119
williamr@2
   120
  template <typename Array, std::size_t NumDims >
williamr@2
   121
  struct MutableMultiArrayConcept
williamr@2
   122
  {
williamr@2
   123
    void constraints() {
williamr@2
   124
      //    function_requires< CopyConstructibleConcept<Array> >();
williamr@2
   125
williamr@2
   126
      function_requires< boost_concepts::ForwardTraversalConcept<iterator> >();
williamr@2
   127
      function_requires< boost_concepts::ReadableIteratorConcept<iterator> >();
williamr@2
   128
      function_requires< boost_concepts::WritableIteratorConcept<iterator> >();
williamr@2
   129
      function_requires< boost_concepts::ForwardTraversalConcept<const_iterator> >();
williamr@2
   130
      function_requires< boost_concepts::ReadableIteratorConcept<const_iterator> >();
williamr@2
   131
      
williamr@2
   132
      // RG - a( CollectionArchetype) when available...
williamr@2
   133
      value_type vt = a[ id ];
williamr@2
   134
williamr@2
   135
      // Test slicing, keeping only the first dimension, losing the rest
williamr@2
   136
      idgen_helper<NumDims-1>::call(a,idgen[range],id);
williamr@2
   137
williamr@2
   138
      // Test slicing, keeping all dimensions.
williamr@2
   139
      idgen_helper<NumDims-1>::call(a,idgen[range],range);
williamr@2
   140
williamr@2
   141
      st = a.size();
williamr@2
   142
      st = a.num_dimensions();
williamr@2
   143
      st = a.num_elements();
williamr@2
   144
      stp = a.shape();
williamr@2
   145
      idp = a.strides();
williamr@2
   146
      idp = a.index_bases();
williamr@2
   147
      it = a.begin();
williamr@2
   148
      it = a.end();
williamr@2
   149
      rit = a.rbegin();
williamr@2
   150
      rit = a.rend();
williamr@2
   151
      eltp = a.origin();
williamr@2
   152
      const_constraints(a);
williamr@2
   153
    }
williamr@2
   154
williamr@2
   155
    void const_constraints(const Array& a) {
williamr@2
   156
williamr@2
   157
      //      value_type vt = a[ id ];
williamr@2
   158
williamr@2
   159
      // Test slicing, keeping only the first dimension, losing the rest
williamr@2
   160
      idgen_helper<NumDims-1>::call(a,idgen[range],id);
williamr@2
   161
williamr@2
   162
      // Test slicing, keeping all dimensions.
williamr@2
   163
      idgen_helper<NumDims-1>::call(a,idgen[range],range);
williamr@2
   164
williamr@2
   165
      st = a.size();
williamr@2
   166
      st = a.num_dimensions();
williamr@2
   167
      st = a.num_elements();
williamr@2
   168
      stp = a.shape();
williamr@2
   169
      idp = a.strides();
williamr@2
   170
      idp = a.index_bases();
williamr@2
   171
      cit = a.begin();
williamr@2
   172
      cit = a.end();
williamr@2
   173
      crit = a.rbegin();
williamr@2
   174
      crit = a.rend();
williamr@2
   175
      eltp = a.origin();
williamr@2
   176
    }
williamr@2
   177
williamr@2
   178
    typedef typename Array::value_type value_type;
williamr@2
   179
    typedef typename Array::reference reference;
williamr@2
   180
    typedef typename Array::const_reference const_reference;
williamr@2
   181
    typedef typename Array::size_type size_type;
williamr@2
   182
    typedef typename Array::difference_type difference_type;
williamr@2
   183
    typedef typename Array::iterator iterator;
williamr@2
   184
    typedef typename Array::const_iterator const_iterator;
williamr@2
   185
    typedef typename Array::reverse_iterator reverse_iterator;
williamr@2
   186
    typedef typename Array::const_reverse_iterator const_reverse_iterator;
williamr@2
   187
    typedef typename Array::element element;
williamr@2
   188
    typedef typename Array::index index;
williamr@2
   189
    typedef typename Array::index_gen index_gen;
williamr@2
   190
    typedef typename Array::index_range index_range;
williamr@2
   191
    typedef typename Array::extent_gen extent_gen;
williamr@2
   192
    typedef typename Array::extent_range extent_range;
williamr@2
   193
williamr@2
   194
    Array a;
williamr@2
   195
    size_type st;
williamr@2
   196
    const size_type* stp;
williamr@2
   197
    index id;
williamr@2
   198
    const index* idp;
williamr@2
   199
    iterator it;
williamr@2
   200
    const_iterator cit;
williamr@2
   201
    reverse_iterator rit;
williamr@2
   202
    const_reverse_iterator crit;
williamr@2
   203
    const element* eltp;
williamr@2
   204
    index_gen idgen;
williamr@2
   205
    index_range range;
williamr@2
   206
  };
williamr@2
   207
williamr@2
   208
williamr@2
   209
} // namespace multi_array
williamr@2
   210
} // namespace detail
williamr@2
   211
} // namespace boost
williamr@2
   212
williamr@2
   213
williamr@2
   214
#endif // BOOST_MULTI_ARRAY_CONCEPT_CHECKS_RG110101_HPP