TooN Algorithm Library - tag  0.2
array.h
Go to the documentation of this file.
1 #ifndef TAG_INC_ARRAY_H
2 #define TAG_INC_ARRAY_H
3 #include <tag/tuple.h>
4 
5 namespace tag
6 {
7 
8 template<class C=int, int I=-1> class array;
9 
10 template<> struct array<int, -1>
11 {
12  struct Underfill{};
13 };
14 
15 
16 template<class C, int I> class array
17 {
18  public:
19 
20  typedef C* iterator;
21  typedef const C* const_iterator;
22 
23  iterator begin(){return data;}
24  const_iterator begin()const {return data;}
25 
26  iterator end(){return data+I;}
27  const_iterator end()const {return data+I;}
28 
29  operator C*() { return data; }
30  operator const C*() const { return data; }
31 
32  C& operator*(){return *data;}
33  const C& operator*() const {return *data;}
34 
35  C& operator[](int i){return data[i];}
36  const C& operator[](int i)const {return data[i];}
37 
38  C* operator+(int i){return data+i;}
39  const C* operator+(int i)const{return data+i;}
40 
41 
42  int size()const
43  {
44  return I;
45  }
46 
47  array(){}
48 
49  template<class D, class E> array(const T_list<D, E>& l)
50  {
51  //array<> is just used as a placeholder class to prevent template
52  //instantiation happening too early. A proper class (instead of a
53  //builtin) is required to generate the proper error messages.
54  typedef typename sizetoolong<array<>, (T_list<D,E>::elements > I) >::dummy foo;
55  typedef typename sizetooshort<array<>, (T_list<D,E>::elements < I) >::dummy bar;
56  array_filler<D, E, T_list<D,E>::elements -1>::fill(data, l);
57  }
58 
59  template<class D, class E> array(const T_list<typename array<int,-1>::Underfill, T_list<D,E> >& l)
60  {
61  typedef typename sizetoolong<array<>, (T_list<D,E>::elements > I) >::dummy foo;
62  array_filler<D, E, T_list<D,E>::elements -1>::fill(data, l.next);
63  }
64 
65  private:
66  C data[I];
67 
68 
69 
70  template<class D, class E, int i> struct array_filler
71  {
72  static void fill(C* data, const T_list<D, E>& l)
73  {
74  data[i] = l.val;
75  array_filler<typename E::val_type, typename E::next_type, i-1>::fill(data, l.next);
76  }
77  };
78 
79  template<class D, class E> struct array_filler<D,E,-1>
80  {
81  static void fill(C*, const T_list<D, E>&){}
82  };
83 
84  template<class D, int i> struct sizetoolong
85  {
86  typedef typename D::Error_initializer_list_is_too_long dummy;
87  };
88 
89  template<class D> struct sizetoolong<D, 0>
90  {
91  typedef int dummy;
92  };
93 
94  template<class D, int i> struct sizetooshort
95  {
96  typedef typename D::Error_initializer_list_is_too_short dummy;
97  };
98 
99  template<class D> struct sizetooshort<D, 0>
100  {
101  typedef int dummy;
102  };
103 };
104 }
105 #endif