epoc32/include/stdapis/boost/multi_array/storage_order.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_STORAGE_ORDER_RG071801_HPP
williamr@2
    14
#define BOOST_STORAGE_ORDER_RG071801_HPP
williamr@2
    15
williamr@2
    16
#include "boost/multi_array/types.hpp"
williamr@2
    17
#include "boost/array.hpp"
williamr@2
    18
#include "boost/multi_array/algorithm.hpp"
williamr@2
    19
#include <algorithm>
williamr@2
    20
#include <cstddef>
williamr@2
    21
#include <functional>
williamr@2
    22
#include <numeric>
williamr@2
    23
#include <vector>
williamr@2
    24
williamr@2
    25
namespace boost {
williamr@2
    26
williamr@2
    27
  // RG - This is to make things work with VC++. So sad, so sad.
williamr@2
    28
  class c_storage_order; 
williamr@2
    29
  class fortran_storage_order;
williamr@2
    30
williamr@2
    31
  template <std::size_t NumDims>
williamr@2
    32
  class general_storage_order
williamr@2
    33
  {
williamr@2
    34
  public:
williamr@2
    35
    typedef detail::multi_array::size_type size_type;
williamr@2
    36
    template <typename OrderingIter, typename AscendingIter>
williamr@2
    37
    general_storage_order(OrderingIter ordering,
williamr@2
    38
                          AscendingIter ascending) {
williamr@2
    39
      boost::detail::multi_array::copy_n(ordering,NumDims,ordering_.begin());
williamr@2
    40
      boost::detail::multi_array::copy_n(ascending,NumDims,ascending_.begin());
williamr@2
    41
    }
williamr@2
    42
williamr@2
    43
    // RG - ideally these would not be necessary, but some compilers
williamr@2
    44
    // don't like template conversion operators.  I suspect that not
williamr@2
    45
    // too many folk will feel the need to use customized
williamr@2
    46
    // storage_order objects, I sacrifice that feature for compiler support.
williamr@2
    47
    general_storage_order(const c_storage_order&) {
williamr@2
    48
      for (size_type i=0; i != NumDims; ++i) {
williamr@2
    49
        ordering_[i] = NumDims - 1 - i;
williamr@2
    50
      }
williamr@2
    51
      ascending_.assign(true);
williamr@2
    52
    }
williamr@2
    53
williamr@2
    54
    general_storage_order(const fortran_storage_order&) {
williamr@2
    55
      for (size_type i=0; i != NumDims; ++i) {
williamr@2
    56
        ordering_[i] = i;
williamr@2
    57
      }
williamr@2
    58
      ascending_.assign(true);
williamr@2
    59
    }
williamr@2
    60
williamr@2
    61
    size_type ordering(size_type dim) const { return ordering_[dim]; }
williamr@2
    62
    bool ascending(size_type dim) const { return ascending_[dim]; }
williamr@2
    63
williamr@2
    64
    bool all_dims_ascending() const {
williamr@2
    65
      return std::accumulate(ascending_.begin(),ascending_.end(),true,
williamr@2
    66
                      std::logical_and<bool>());
williamr@2
    67
    }
williamr@2
    68
williamr@2
    69
    bool operator==(general_storage_order const& rhs) const {
williamr@2
    70
      return (ordering_ == rhs.ordering_) &&
williamr@2
    71
        (ascending_ == rhs.ascending_);
williamr@2
    72
    }
williamr@2
    73
williamr@2
    74
  protected:
williamr@2
    75
    boost::array<size_type,NumDims> ordering_;
williamr@2
    76
    boost::array<bool,NumDims> ascending_;
williamr@2
    77
  };
williamr@2
    78
williamr@2
    79
  class c_storage_order 
williamr@2
    80
  {
williamr@2
    81
    typedef detail::multi_array::size_type size_type;
williamr@2
    82
  public:
williamr@2
    83
    // This is the idiom for creating your own custom storage orders.
williamr@2
    84
    // Not supported by all compilers though!
williamr@2
    85
#ifndef __MWERKS__ // Metrowerks screams "ambiguity!"
williamr@2
    86
    template <std::size_t NumDims>
williamr@2
    87
    operator general_storage_order<NumDims>() const {
williamr@2
    88
      boost::array<size_type,NumDims> ordering;
williamr@2
    89
      boost::array<bool,NumDims> ascending;
williamr@2
    90
williamr@2
    91
      for (size_type i=0; i != NumDims; ++i) {
williamr@2
    92
        ordering[i] = NumDims - 1 - i;
williamr@2
    93
        ascending[i] = true;
williamr@2
    94
      }
williamr@2
    95
      return general_storage_order<NumDims>(ordering.begin(),
williamr@2
    96
                                            ascending.begin());
williamr@2
    97
    }
williamr@2
    98
#endif
williamr@2
    99
  };
williamr@2
   100
williamr@2
   101
  class fortran_storage_order
williamr@2
   102
  {
williamr@2
   103
    typedef detail::multi_array::size_type size_type;
williamr@2
   104
  public:
williamr@2
   105
    // This is the idiom for creating your own custom storage orders.
williamr@2
   106
    // Not supported by all compilers though! 
williamr@2
   107
#ifndef __MWERKS__ // Metrowerks screams "ambiguity!"
williamr@2
   108
    template <std::size_t NumDims>
williamr@2
   109
    operator general_storage_order<NumDims>() const {
williamr@2
   110
      boost::array<size_type,NumDims> ordering;
williamr@2
   111
      boost::array<bool,NumDims> ascending;
williamr@2
   112
williamr@2
   113
      for (size_type i=0; i != NumDims; ++i) {
williamr@2
   114
        ordering[i] = i;
williamr@2
   115
        ascending[i] = true;
williamr@2
   116
      }
williamr@2
   117
      return general_storage_order<NumDims>(ordering.begin(),
williamr@2
   118
                                            ascending.begin());
williamr@2
   119
    }
williamr@2
   120
#endif
williamr@2
   121
  };
williamr@2
   122
williamr@2
   123
} // namespace boost
williamr@2
   124
williamr@2
   125
#endif // BOOST_ARRAY_STORAGE_RG071801_HPP