epoc32/include/stdapis/boost/multi_array/index_range.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
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_INDEX_RANGE_RG071801_HPP
williamr@2
    14
#define BOOST_INDEX_RANGE_RG071801_HPP
williamr@2
    15
williamr@2
    16
#include <boost/config.hpp>
williamr@2
    17
#include <utility>
williamr@2
    18
#include <boost/limits.hpp>
williamr@2
    19
williamr@2
    20
// For representing intervals, also with stride.
williamr@2
    21
// A degenerate range is a range with one element.
williamr@2
    22
williamr@2
    23
// Thanks to Doug Gregor for the really cool idea of using the
williamr@2
    24
// comparison operators to express various interval types!
williamr@2
    25
williamr@2
    26
// Internally, we represent the interval as half-open.
williamr@2
    27
williamr@2
    28
namespace boost {
williamr@2
    29
namespace detail {
williamr@2
    30
namespace multi_array {
williamr@2
    31
williamr@2
    32
  template <typename Index,typename SizeType>
williamr@2
    33
  class index_range {
williamr@2
    34
  public:
williamr@2
    35
    typedef Index index;
williamr@2
    36
    typedef SizeType size_type;
williamr@2
    37
williamr@2
    38
  private:
williamr@2
    39
    static index from_start()
williamr@2
    40
      { return (std::numeric_limits<index>::min)(); }
williamr@2
    41
williamr@2
    42
    static index to_end()
williamr@2
    43
      { return (std::numeric_limits<index>::max)(); }
williamr@2
    44
williamr@2
    45
  public:
williamr@2
    46
williamr@2
    47
    index_range()
williamr@2
    48
    {
williamr@2
    49
      start_ = from_start();
williamr@2
    50
      finish_ = to_end();
williamr@2
    51
      stride_ = 1;
williamr@2
    52
      degenerate_ = false;
williamr@2
    53
    }
williamr@2
    54
williamr@2
    55
    explicit index_range(index pos)
williamr@2
    56
    {
williamr@2
    57
      start_ = pos;
williamr@2
    58
      finish_ = pos+1;
williamr@2
    59
      stride_ = 1;
williamr@2
    60
      degenerate_ = true;
williamr@2
    61
    }
williamr@2
    62
williamr@2
    63
    explicit index_range(index start, index finish, index stride=1)
williamr@2
    64
      : start_(start), finish_(finish), stride_(stride),
williamr@2
    65
        degenerate_(false)
williamr@2
    66
    { }
williamr@2
    67
williamr@2
    68
williamr@2
    69
    // These are for chaining assignments to an index_range
williamr@2
    70
    index_range& start(index s) {
williamr@2
    71
      start_ = s;
williamr@2
    72
      degenerate_ = false;
williamr@2
    73
      return *this;
williamr@2
    74
    }
williamr@2
    75
williamr@2
    76
    index_range& finish(index f) {
williamr@2
    77
      finish_ = f;
williamr@2
    78
      degenerate_ = false;
williamr@2
    79
      return *this;
williamr@2
    80
    }
williamr@2
    81
williamr@2
    82
    index_range& stride(index s) { stride_ = s; return *this; }
williamr@2
    83
williamr@2
    84
    index start() const
williamr@2
    85
    { 
williamr@2
    86
      return start_; 
williamr@2
    87
    }
williamr@2
    88
williamr@2
    89
    index get_start(index low_index_range = index_range::from_start()) const
williamr@2
    90
    { 
williamr@2
    91
      if (start_ == from_start())
williamr@2
    92
        return low_index_range;
williamr@2
    93
      return start_; 
williamr@2
    94
    }
williamr@2
    95
williamr@2
    96
    index finish() const
williamr@2
    97
    {
williamr@2
    98
      return finish_;
williamr@2
    99
    }
williamr@2
   100
williamr@2
   101
    index get_finish(index high_index_range = index_range::to_end()) const
williamr@2
   102
    {
williamr@2
   103
      if (finish_ == to_end())
williamr@2
   104
        return high_index_range;
williamr@2
   105
      return finish_;
williamr@2
   106
    }
williamr@2
   107
williamr@2
   108
    index stride() const { return stride_; }
williamr@2
   109
williamr@2
   110
    void set_index_range(index start, index finish, index stride=1)
williamr@2
   111
    {
williamr@2
   112
      start_ = start;
williamr@2
   113
      finish_ = finish;
williamr@2
   114
      stride_ = stride;
williamr@2
   115
    }
williamr@2
   116
williamr@2
   117
    static index_range all() 
williamr@2
   118
    { return index_range(from_start(), to_end(), 1); }
williamr@2
   119
williamr@2
   120
    bool is_degenerate() const { return degenerate_; }
williamr@2
   121
williamr@2
   122
    index_range operator-(index shift) const
williamr@2
   123
    { 
williamr@2
   124
      return index_range(start_ - shift, finish_ - shift, stride_); 
williamr@2
   125
    }
williamr@2
   126
williamr@2
   127
    index_range operator+(index shift) const
williamr@2
   128
    { 
williamr@2
   129
      return index_range(start_ + shift, finish_ + shift, stride_); 
williamr@2
   130
    }
williamr@2
   131
williamr@2
   132
    index operator[](unsigned i) const
williamr@2
   133
    {
williamr@2
   134
      return start_ + i * stride_;
williamr@2
   135
    }
williamr@2
   136
williamr@2
   137
    index operator()(unsigned i) const
williamr@2
   138
    {
williamr@2
   139
      return start_ + i * stride_;
williamr@2
   140
    }
williamr@2
   141
williamr@2
   142
    // add conversion to std::slice?
williamr@2
   143
williamr@2
   144
  public:
williamr@2
   145
    index start_, finish_, stride_;
williamr@2
   146
    bool degenerate_;
williamr@2
   147
  };
williamr@2
   148
williamr@2
   149
  // Express open and closed interval end-points using the comparison
williamr@2
   150
  // operators.
williamr@2
   151
williamr@2
   152
  // left closed
williamr@2
   153
  template <typename Index, typename SizeType>
williamr@2
   154
  inline index_range<Index,SizeType>
williamr@2
   155
  operator<=(Index s, const index_range<Index,SizeType>& r)
williamr@2
   156
  {
williamr@2
   157
    return index_range<Index,SizeType>(s, r.finish(), r.stride());
williamr@2
   158
  }
williamr@2
   159
williamr@2
   160
  // left open
williamr@2
   161
  template <typename Index, typename SizeType>
williamr@2
   162
  inline index_range<Index,SizeType>
williamr@2
   163
  operator<(Index s, const index_range<Index,SizeType>& r)
williamr@2
   164
  {
williamr@2
   165
    return index_range<Index,SizeType>(s + 1, r.finish(), r.stride());
williamr@2
   166
  }
williamr@2
   167
williamr@2
   168
  // right open
williamr@2
   169
  template <typename Index, typename SizeType>
williamr@2
   170
  inline index_range<Index,SizeType>
williamr@2
   171
  operator<(const index_range<Index,SizeType>& r, Index f)
williamr@2
   172
  {
williamr@2
   173
    return index_range<Index,SizeType>(r.start(), f, r.stride());
williamr@2
   174
  }
williamr@2
   175
williamr@2
   176
  // right closed
williamr@2
   177
  template <typename Index, typename SizeType>
williamr@2
   178
  inline index_range<Index,SizeType>
williamr@2
   179
  operator<=(const index_range<Index,SizeType>& r, Index f)
williamr@2
   180
  {
williamr@2
   181
    return index_range<Index,SizeType>(r.start(), f + 1, r.stride());
williamr@2
   182
  }
williamr@2
   183
williamr@2
   184
} // namespace multi_array
williamr@2
   185
} // namespace detail  
williamr@2
   186
} // namespace boost
williamr@2
   187
williamr@2
   188
#endif // BOOST_INDEX_RANGE_RG071801_HPP