]> git.lyx.org Git - lyx.git/blob - boost/boost/multi_array/index_gen.hpp
2002-05-24 Lars Gullik Bj�nnes <larsbj@birdstep.com>
[lyx.git] / boost / boost / multi_array / index_gen.hpp
1 #ifndef BOOST_INDEX_GEN_RG071801_HPP
2 #define BOOST_INDEX_GEN_RG071801_HPP
3
4 #include "boost/array.hpp"
5 #include "boost/multi_array/index_range.hpp"
6 #include "boost/multi_array/range_list.hpp"
7 #include "boost/multi_array/types.hpp"
8 #include <algorithm> 
9 #include <cstddef>
10
11 namespace boost {
12 namespace detail {
13 namespace multi_array {
14
15
16 template <int NumRanges, int NumDims>
17 struct index_gen {
18 private:
19   typedef index Index;
20   typedef std::size_t SizeType;
21   typedef index_range<Index,SizeType> range;
22 public:
23   template <int Dims, int Ranges>
24   struct gen_type {
25     typedef index_gen<Ranges,Dims> type;
26   };
27
28   typedef typename range_list_generator<range,NumRanges>::type range_list;
29   range_list ranges_;
30
31   index_gen() { }
32
33   template <int ND>
34   explicit index_gen(const index_gen<NumRanges-1,ND>& rhs,
35             const index_range<Index,SizeType>& range)
36   {
37     std::copy(rhs.ranges_.begin(),rhs.ranges_.end(),ranges_.begin());
38     *ranges_.rbegin() = range;
39   }
40
41   index_gen<NumRanges+1,NumDims+1>
42   operator[](const index_range<Index,SizeType>& range) const
43   {
44     index_gen<NumRanges+1,NumDims+1> tmp;
45     std::copy(ranges_.begin(),ranges_.end(),tmp.ranges_.begin());
46     *tmp.ranges_.rbegin() = range;
47     return tmp;
48   }
49
50   index_gen<NumRanges+1,NumDims>
51   operator[](Index idx) const
52   {
53     index_gen<NumRanges+1,NumDims> tmp;
54     std::copy(ranges_.begin(),ranges_.end(),tmp.ranges_.begin());
55     *tmp.ranges_.rbegin() = index_range<Index,SizeType>(idx);
56     return tmp;
57   }    
58
59   static index_gen<0,0> indices() {
60     return index_gen<0,0>();
61   }
62 };
63
64 } // namespace multi_array
65 } // namespace detail
66 } // namespace boost
67
68
69 #endif // BOOST_INDEX_GEN_RG071801_HPP