Forward compatibility: flex
[foam-extend-3.2.git] / applications / utilities / mesh / advanced / modifyMesh / Tuple.H
blob81ad0258c39e83cc2d820dfe7367d20d09926982
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::Tuple
27 Description
28     A 2 Tuple. Differs from Tuple in that the two elements can be different
29     type.
32 \*---------------------------------------------------------------------------*/
34 #ifndef Tuple_H
35 #define Tuple_H
37 #include "Istream.H"
38 #include "Ostream.H"
40 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
42 namespace Foam
45 // Forward declaration of friend functions and operators
47 template<class Type1, class Type2>
48 class Tuple;
50 template<class Type1, class Type2>
51 Istream& operator>>(Istream&, Tuple<Type1, Type2>&);
53 template<class Type1, class Type2>
54 Ostream& operator<<(Ostream&, const Tuple<Type1, Type2>&);
56 /*---------------------------------------------------------------------------*\
57                             Class Tuple Declaration
58 \*---------------------------------------------------------------------------*/
60 template<class Type1, class Type2>
61 class Tuple
63     // Private data
65        Type1 first_;
66        Type2 second_;
69 public:
71     // Constructors
73         //- Null constructor for lists
74         inline Tuple()
75         {}
77         //- Construct from components
78         inline Tuple(const Type1& first, const Type2& second)
79         :
80             first_(first),
81             second_(second)
82         {}
84         //- Construct from Istream
85         inline Tuple(Istream& is)
86         {
87             // Read beginning of pair
88             is.readBegin("pair");
90             is >> first_ >> second_;
92             // Read end of pair
93             is.readEnd("pair");
95             // Check state of Istream
96             is.check("Tuple::Tuple(Istream&)");
97         }
100     // Member Functions
102         //- Return first
103         inline Type1 first() const
104         {
105             return first_;
106         }
108         //- Return first
109         inline Type1& first()
110         {
111             return first_;
112         }
114         //- Return second
115         inline Type2 second() const
116         {
117             return second_;
118         }
120         //- Return second
121         inline Type2& second()
122         {
123             return second_;
124         }
126         //- Return reverse pair
127         inline Tuple<Type1, Type2> reverseTuple() const
128         {
129             return Tuple<Type1, Type2>(second_, first_);
130         }
133     // Friend Operators
135         inline friend bool operator==
136         (
137             const Tuple<Type1, Type2>& a,
138             const Tuple<Type1, Type2>& b
139         )
140         {
141             return
142             (
143                 (a.first_ == b.first_) && (a.second_ == b.second_)
144             );
145         }
147         inline friend bool operator!=
148         (
149             const Tuple<Type1, Type2>& a,
150             const Tuple<Type1, Type2>& b
151         )
152         {
153             return (!(a == b));
154         }
157     // IOstream Operators
159         friend Istream& operator>> <Type1, Type2>
160         (
161             Istream& is,
162             Tuple<Type1, Type2>& p
163         );
164         friend Ostream& operator<< <Type1, Type2>
165         (
166             Ostream& os,
167             const Tuple<Type1, Type2>& p
168         );
172 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
174 template<class Type1, class Type2>
175 Istream& operator>>(Istream& is, Tuple<Type1, Type2>& p)
177     // Read beginning of Tuple<Type, Type>
178     is.readBegin("Tuple<Type, Type>");
180     is >> p.first_ >> p.second_;
182     // Read end of Tuple<Type, Type>
183     is.readEnd("Tuple<Type, Type>");
185     // Check state of Ostream
186     is.check("Istream& operator>>(Istream&, Tuple<Type, Type>&)");
188     return is;
191 template<class Type1, class Type2>
192 Ostream& operator<<(Ostream& os, const Tuple<Type1, Type2>& p)
194     os  << token::BEGIN_LIST
195         << p.first_ << token::SPACE
196         << p.second_
197         << token::END_LIST;
199     // Check state of Ostream
200     os.check("Ostream& operator<<(Ostream&, const Tuple<Type, Type>&)");
202     return os;
206 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
208 } // End namespace Foam
210 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
212 #endif
214 // ************************************************************************* //