00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _TUPLE_H_
00012 #define _TUPLE_H_
00013
00014 #include <cstdlib>
00015 #include "CH_assert.H"
00016 #include "BaseNamespaceHeader.H"
00017 using namespace std;
00018
00019
00021
00029 template <class T, size_t N>
00030 class Tuple
00031 {
00032 public:
00033
00039 Tuple ();
00040
00047
00048
00049
00050
00051 Tuple (const Tuple& rhs);
00052
00053
00054
00055 Tuple& operator= (const Tuple& rhs);
00056
00061 T& operator[] (int i);
00062
00067 const T& operator[] (int i) const;
00068
00073 operator const T* () const;
00074
00075 protected:
00076
00077
00078
00079 T vect[N];
00080 };
00081
00082
00083
00084
00085
00086 template <class T, size_t N>
00087 inline
00088 Tuple<T,N>::Tuple()
00089 {}
00090
00091 template <class T, size_t N>
00092 inline
00093 T&
00094 Tuple<T,N>::operator[] (int i)
00095 {
00096 CH_assert(0 <= i && i < (int)N);
00097 return vect[i];
00098 }
00099
00100 template <class T, size_t N>
00101 inline
00102 const T&
00103 Tuple<T,N>::operator[] (int i) const
00104 {
00105 CH_assert(0 <= i && i < (int)N);
00106 return vect[i];
00107 }
00108
00109 template <class T, size_t N>
00110 inline
00111 Tuple<T,N>::operator const T* () const
00112 {
00113 return &vect[0];
00114 }
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 template <class T, size_t N>
00125 Tuple<T,N>::Tuple (const Tuple<T,N>& rhs)
00126 {
00127 for (size_t i = 0; i < N; ++i)
00128 vect[i] = rhs.vect[i];
00129 }
00130
00131 template <class T, size_t N>
00132 Tuple<T,N>&
00133 Tuple<T,N>::operator= (const Tuple<T,N>& rhs)
00134 {
00135 for (size_t i = 0; i < N; ++i)
00136 vect[i] = rhs.vect[i];
00137 return *this;
00138 }
00139
00140 #include "BaseNamespaceFooter.H"
00141 #endif