Go to the documentation of this file.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
00029
00030
00031
00032
00033
00034 #ifndef Tuple_H
00035 #define Tuple_H
00036
00037 #include <OpenFOAM/Istream.H>
00038 #include <OpenFOAM/Ostream.H>
00039
00040
00041
00042 namespace Foam
00043 {
00044
00045
00046
00047 template<class Type1, class Type2>
00048 class Tuple;
00049
00050 template<class Type1, class Type2>
00051 Istream& operator>>(Istream&, Tuple<Type1, Type2>&);
00052
00053 template<class Type1, class Type2>
00054 Ostream& operator<<(Ostream&, const Tuple<Type1, Type2>&);
00055
00056
00057
00058
00059
00060 template<class Type1, class Type2>
00061 class Tuple
00062 {
00063
00064
00065 Type1 first_;
00066 Type2 second_;
00067
00068
00069 public:
00070
00071
00072
00073
00074 inline Tuple()
00075 {}
00076
00077
00078 inline Tuple(const Type1& first, const Type2& second)
00079 :
00080 first_(first),
00081 second_(second)
00082 {}
00083
00084
00085 inline Tuple(Istream& is)
00086 {
00087
00088 is.readBegin("pair");
00089
00090 is >> first_ >> second_;
00091
00092
00093 is.readEnd("pair");
00094
00095
00096 is.check("Tuple::Tuple(Istream&)");
00097 }
00098
00099
00100
00101
00102
00103 inline Type1 first() const
00104 {
00105 return first_;
00106 }
00107
00108
00109 inline Type1& first()
00110 {
00111 return first_;
00112 }
00113
00114
00115 inline Type2 second() const
00116 {
00117 return second_;
00118 }
00119
00120
00121 inline Type2& second()
00122 {
00123 return second_;
00124 }
00125
00126
00127 inline Tuple<Type1, Type2> reverseTuple() const
00128 {
00129 return Tuple<Type1, Type2>(second_, first_);
00130 }
00131
00132
00133
00134
00135 inline friend bool operator==
00136 (
00137 const Tuple<Type1, Type2>& a,
00138 const Tuple<Type1, Type2>& b
00139 )
00140 {
00141 return
00142 (
00143 (a.first_ == b.first_) && (a.second_ == b.second_)
00144 );
00145 }
00146
00147 inline friend bool operator!=
00148 (
00149 const Tuple<Type1, Type2>& a,
00150 const Tuple<Type1, Type2>& b
00151 )
00152 {
00153 return (!(a == b));
00154 }
00155
00156
00157
00158
00159 friend Istream& operator>> <Type1, Type2>
00160 (
00161 Istream& is,
00162 Tuple<Type1, Type2>& p
00163 );
00164 friend Ostream& operator<< <Type1, Type2>
00165 (
00166 Ostream& os,
00167 const Tuple<Type1, Type2>& p
00168 );
00169 };
00170
00171
00172
00173
00174 template<class Type1, class Type2>
00175 Istream& operator>>(Istream& is, Tuple<Type1, Type2>& p)
00176 {
00177
00178 is.readBegin("Tuple<Type, Type>");
00179
00180 is >> p.first_ >> p.second_;
00181
00182
00183 is.readEnd("Tuple<Type, Type>");
00184
00185
00186 is.check("Istream& operator>>(Istream&, Tuple<Type, Type>&)");
00187
00188 return is;
00189 }
00190
00191 template<class Type1, class Type2>
00192 Ostream& operator<<(Ostream& os, const Tuple<Type1, Type2>& p)
00193 {
00194 os << token::BEGIN_LIST
00195 << p.first_ << token::SPACE
00196 << p.second_
00197 << token::END_LIST;
00198
00199
00200 os.check("Ostream& operator<<(Ostream&, const Tuple<Type, Type>&)");
00201
00202 return os;
00203 }
00204
00205
00206
00207
00208 }
00209
00210
00211
00212 #endif
00213
00214