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
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 template <class T, size_t N>
00030 class Tuple
00031 {
00032 public:
00033
00034
00035
00036
00037
00038
00039 Tuple ();
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 Tuple (const Tuple& rhs);
00052
00053
00054
00055 Tuple& operator= (const Tuple& rhs);
00056
00057
00058
00059
00060
00061 T& operator[] (int i);
00062
00063
00064
00065
00066
00067 const T& operator[] (int i) const;
00068
00069
00070
00071
00072
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
00092 template <class T, size_t N>
00093 inline
00094 T&
00095 Tuple<T,N>::operator[] (int i)
00096 {
00097 CH_assert(0 <= i && i < (int)N);
00098 return vect[i];
00099 }
00100
00101 template <class T, size_t N>
00102 inline
00103 const T&
00104 Tuple<T,N>::operator[] (int i) const
00105 {
00106 CH_assert(0 <= i && i < (int)N);
00107 return vect[i];
00108 }
00109
00110 template <class T, size_t N>
00111 inline
00112 Tuple<T,N>::operator const T* () const
00113 {
00114 return &vect[0];
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 template <class T, size_t N>
00126 Tuple<T,N>::Tuple (const Tuple<T,N>& rhs)
00127 {
00128 for (size_t i = 0; i < N; ++i)
00129 vect[i] = rhs.vect[i];
00130 }
00131
00132 template <class T, size_t N>
00133 Tuple<T,N>&
00134 Tuple<T,N>::operator= (const Tuple<T,N>& rhs)
00135 {
00136 for (size_t i = 0; i < N; ++i)
00137 vect[i] = rhs.vect[i];
00138 return *this;
00139 }
00140
00141 #include "BaseNamespaceFooter.H"
00142 #endif