Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / containers / Lists / UList / UListIO.C
blobd9622ca3d6ade231c4e743d38a416426d1366707
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "UList.H"
27 #include "Ostream.H"
28 #include "token.H"
29 #include "contiguous.H"
31 // * * * * * * * * * * * * * * * Ostream Operator *  * * * * * * * * * * * * //
33 template<class T>
34 void Foam::UList<T>::writeEntry(Ostream& os) const
36     if
37     (
38         size()
39      && token::compound::isCompound
40         (
41             "List<" + word(pTraits<T>::typeName) + '>'
42         )
43     )
44     {
45         os  << word("List<" + word(pTraits<T>::typeName) + '>') << " ";
46     }
48     os << *this;
52 template<class T>
53 void Foam::UList<T>::writeEntry(const word& keyword, Ostream& os) const
55     os.writeKeyword(keyword);
56     writeEntry(os);
57     os << token::END_STATEMENT << endl;
61 template<class T>
62 Foam::Ostream& Foam::operator<<(Foam::Ostream& os, const Foam::UList<T>& L)
64     // Write list contents depending on data format
65     if (os.format() == IOstream::ASCII || !contiguous<T>())
66     {
67         bool uniform = false;
69         if (L.size() > 1 && contiguous<T>())
70         {
71             uniform = true;
73             forAll(L, i)
74             {
75                 if (L[i] != L[0])
76                 {
77                     uniform = false;
78                     break;
79                 }
80             }
81         }
83         if (uniform)
84         {
85             // Write size and start delimiter
86             os << L.size() << token::BEGIN_BLOCK;
88             // Write contents
89             os << L[0];
91             // Write end delimiter
92             os << token::END_BLOCK;
93         }
94         else if (L.size() < 11 && contiguous<T>())
95         {
96             // Write size and start delimiter
97             os << L.size() << token::BEGIN_LIST;
99             // Write contents
100             forAll(L, i)
101             {
102                 if (i > 0) os << token::SPACE;
103                 os << L[i];
104             }
106             // Write end delimiter
107             os << token::END_LIST;
108         }
109         else
110         {
111             // Write size and start delimiter
112             os << nl << L.size() << nl << token::BEGIN_LIST;
114             // Write contents
115             forAll(L, i)
116             {
117                 os << nl << L[i];
118             }
120             // Write end delimiter
121             os << nl << token::END_LIST << nl;
122         }
123     }
124     else
125     {
126         os << nl << L.size() << nl;
127         if (L.size())
128         {
129             os.write(reinterpret_cast<const char*>(L.v_), L.byteSize());
130         }
131     }
133     // Check state of IOstream
134     os.check("Ostream& operator<<(Ostream&, const UList&)");
136     return os;
140 // ************************************************************************* //