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.
     1 // Copyright 2002 The Trustees of Indiana University.
     2 
     3 // Use, modification and distribution is subject to the Boost Software 
     4 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
     5 // http://www.boost.org/LICENSE_1_0.txt)
     6 
     7 //  Boost.MultiArray Library
     8 //  Authors: Ronald Garcia
     9 //           Jeremy Siek
    10 //           Andrew Lumsdaine
    11 //  See http://www.boost.org/libs/multi_array for documentation.
    12 
    13 #ifndef BOOST_INDEX_RANGE_RG071801_HPP
    14 #define BOOST_INDEX_RANGE_RG071801_HPP
    15 
    16 #include <boost/config.hpp>
    17 #include <utility>
    18 #include <boost/limits.hpp>
    19 
    20 // For representing intervals, also with stride.
    21 // A degenerate range is a range with one element.
    22 
    23 // Thanks to Doug Gregor for the really cool idea of using the
    24 // comparison operators to express various interval types!
    25 
    26 // Internally, we represent the interval as half-open.
    27 
    28 namespace boost {
    29 namespace detail {
    30 namespace multi_array {
    31 
    32   template <typename Index,typename SizeType>
    33   class index_range {
    34   public:
    35     typedef Index index;
    36     typedef SizeType size_type;
    37 
    38   private:
    39     static index from_start()
    40       { return (std::numeric_limits<index>::min)(); }
    41 
    42     static index to_end()
    43       { return (std::numeric_limits<index>::max)(); }
    44 
    45   public:
    46 
    47     index_range()
    48     {
    49       start_ = from_start();
    50       finish_ = to_end();
    51       stride_ = 1;
    52       degenerate_ = false;
    53     }
    54 
    55     explicit index_range(index pos)
    56     {
    57       start_ = pos;
    58       finish_ = pos+1;
    59       stride_ = 1;
    60       degenerate_ = true;
    61     }
    62 
    63     explicit index_range(index start, index finish, index stride=1)
    64       : start_(start), finish_(finish), stride_(stride),
    65         degenerate_(false)
    66     { }
    67 
    68 
    69     // These are for chaining assignments to an index_range
    70     index_range& start(index s) {
    71       start_ = s;
    72       degenerate_ = false;
    73       return *this;
    74     }
    75 
    76     index_range& finish(index f) {
    77       finish_ = f;
    78       degenerate_ = false;
    79       return *this;
    80     }
    81 
    82     index_range& stride(index s) { stride_ = s; return *this; }
    83 
    84     index start() const
    85     { 
    86       return start_; 
    87     }
    88 
    89     index get_start(index low_index_range = index_range::from_start()) const
    90     { 
    91       if (start_ == from_start())
    92         return low_index_range;
    93       return start_; 
    94     }
    95 
    96     index finish() const
    97     {
    98       return finish_;
    99     }
   100 
   101     index get_finish(index high_index_range = index_range::to_end()) const
   102     {
   103       if (finish_ == to_end())
   104         return high_index_range;
   105       return finish_;
   106     }
   107 
   108     index stride() const { return stride_; }
   109 
   110     void set_index_range(index start, index finish, index stride=1)
   111     {
   112       start_ = start;
   113       finish_ = finish;
   114       stride_ = stride;
   115     }
   116 
   117     static index_range all() 
   118     { return index_range(from_start(), to_end(), 1); }
   119 
   120     bool is_degenerate() const { return degenerate_; }
   121 
   122     index_range operator-(index shift) const
   123     { 
   124       return index_range(start_ - shift, finish_ - shift, stride_); 
   125     }
   126 
   127     index_range operator+(index shift) const
   128     { 
   129       return index_range(start_ + shift, finish_ + shift, stride_); 
   130     }
   131 
   132     index operator[](unsigned i) const
   133     {
   134       return start_ + i * stride_;
   135     }
   136 
   137     index operator()(unsigned i) const
   138     {
   139       return start_ + i * stride_;
   140     }
   141 
   142     // add conversion to std::slice?
   143 
   144   public:
   145     index start_, finish_, stride_;
   146     bool degenerate_;
   147   };
   148 
   149   // Express open and closed interval end-points using the comparison
   150   // operators.
   151 
   152   // left closed
   153   template <typename Index, typename SizeType>
   154   inline index_range<Index,SizeType>
   155   operator<=(Index s, const index_range<Index,SizeType>& r)
   156   {
   157     return index_range<Index,SizeType>(s, r.finish(), r.stride());
   158   }
   159 
   160   // left open
   161   template <typename Index, typename SizeType>
   162   inline index_range<Index,SizeType>
   163   operator<(Index s, const index_range<Index,SizeType>& r)
   164   {
   165     return index_range<Index,SizeType>(s + 1, r.finish(), r.stride());
   166   }
   167 
   168   // right open
   169   template <typename Index, typename SizeType>
   170   inline index_range<Index,SizeType>
   171   operator<(const index_range<Index,SizeType>& r, Index f)
   172   {
   173     return index_range<Index,SizeType>(r.start(), f, r.stride());
   174   }
   175 
   176   // right closed
   177   template <typename Index, typename SizeType>
   178   inline index_range<Index,SizeType>
   179   operator<=(const index_range<Index,SizeType>& r, Index f)
   180   {
   181     return index_range<Index,SizeType>(r.start(), f + 1, r.stride());
   182   }
   183 
   184 } // namespace multi_array
   185 } // namespace detail  
   186 } // namespace boost
   187 
   188 #endif // BOOST_INDEX_RANGE_RG071801_HPP