00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef CH_TUPLE_H
00029 #define CH_TUPLE_H
00030
00031
00032
00033
00034
00035 #include <cstdlib>
00036 using namespace std;
00037
00038 #include <cassert>
00039
00040
00042
00050 template <class T, size_t N>
00051 class Tuple
00052 {
00053 public:
00054
00060 Tuple ();
00061
00068
00069
00070
00071
00072 Tuple (const Tuple& rhs);
00073
00074
00075
00076 Tuple& operator= (const Tuple& rhs);
00077
00082 T& operator[] (int i);
00083
00088 const T& operator[] (int i) const;
00089
00094 operator const T* () const;
00095
00096 protected:
00097
00098
00099
00100 T vect[N];
00101 };
00102
00103
00104
00105
00106
00107 template <class T, size_t N>
00108 inline
00109 Tuple<T,N>::Tuple()
00110 {}
00111
00112 template <class T, size_t N>
00113 inline
00114 T&
00115 Tuple<T,N>::operator[] (int i)
00116 {
00117 assert(0 <= i && i < (int)N);
00118 return vect[i];
00119 }
00120
00121 template <class T, size_t N>
00122 inline
00123 const T&
00124 Tuple<T,N>::operator[] (int i) const
00125 {
00126 assert(0 <= i && i < (int)N);
00127 return vect[i];
00128 }
00129
00130 template <class T, size_t N>
00131 inline
00132 Tuple<T,N>::operator const T* () const
00133 {
00134 return &vect[0];
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 template <class T, size_t N>
00147 Tuple<T,N>::Tuple (const Tuple<T,N>& rhs)
00148 {
00149 for (size_t i = 0; i < N; ++i)
00150 vect[i] = rhs.vect[i];
00151 }
00152
00153 template <class T, size_t N>
00154 Tuple<T,N>&
00155 Tuple<T,N>::operator= (const Tuple<T,N>& rhs)
00156 {
00157 for (size_t i = 0; i < N; ++i)
00158 vect[i] = rhs.vect[i];
00159 return *this;
00160 }
00161
00162 #endif