fixed writing out entries in advective bc
[OpenFOAM-1.6-ext.git] / src / OpenFOAM / containers / Lists / UIndirectList / UIndirectListIO.C
bloba73da931952b9c7293d12033f5d20bb3401a6e08
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright held by original author
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 the
13     Free Software Foundation; either version 2 of the License, or (at your
14     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, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "UIndirectList.H"
28 #include "Ostream.H"
29 #include "token.H"
30 #include "contiguous.H"
32 // * * * * * * * * * * * * * * * Ostream Operator *  * * * * * * * * * * * * //
34 template<class T>
35 Foam::Ostream& Foam::operator<<
37     Foam::Ostream& os,
38     const Foam::UIndirectList<T>& L
41     // Write list contents depending on data format
42     if (os.format() == IOstream::ASCII || !contiguous<T>())
43     {
44         bool uniform = false;
46         if (L.size() > 1 && contiguous<T>())
47         {
48             uniform = true;
50             forAll(L, i)
51             {
52                 if (L[i] != L[0])
53                 {
54                     uniform = false;
55                     break;
56                 }
57             }
58         }
60         if (uniform)
61         {
62             // Write size and start delimiter
63             os << L.size() << token::BEGIN_BLOCK;
65             // Write contents
66             os << L[0];
68             // Write end delimiter
69             os << token::END_BLOCK;
70         }
71         else if (L.size() < 11 && contiguous<T>())
72         {
73             // Write size and start delimiter
74             os << L.size() << token::BEGIN_LIST;
76             // Write contents
77             forAll(L, i)
78             {
79                 if (i) os << token::SPACE;
80                 os << L[i];
81             }
83             // Write end delimiter
84             os << token::END_LIST;
85         }
86         else
87         {
88             // Write size and start delimiter
89             os << nl << L.size() << nl << token::BEGIN_LIST;
91             // Write contents
92             forAll(L, i)
93             {
94                 os << nl << L[i];
95             }
97             // Write end delimiter
98             os << nl << token::END_LIST << nl;
99         }
100     }
101     else
102     {
103         // this is annoying, and wasteful, but there's currently no alternative
105         os << nl << L.size() << nl;
107         if (L.size())
108         {
109             List<T> lst = L();
111             os.write
112             (
113                 reinterpret_cast<const char*>(lst.cdata()),
114                 lst.byteSize()
115             );
116         }
117     }
119     // Check state of IOstream
120     os.check("Ostream& operator<<(Ostream&, const UIndirectList&)");
122     return os;
126 // ************************************************************************* //