Report patch name instead of index in debug
[foam-extend-3.2.git] / src / foam / containers / Lists / UIndirectList / UIndirectListIO.C
blob0e60d29e8c2fe047815b16af43647c962b72c5a6
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 \*---------------------------------------------------------------------------*/
26 #include "UIndirectList.H"
27 #include "Ostream.H"
28 #include "token.H"
29 #include "contiguous.H"
31 // * * * * * * * * * * * * * * * Ostream Operator *  * * * * * * * * * * * * //
33 template<class T>
34 Foam::Ostream& Foam::operator<<
36     Foam::Ostream& os,
37     const Foam::UIndirectList<T>& L
40     // Write list contents depending on data format
41     if (os.format() == IOstream::ASCII || !contiguous<T>())
42     {
43         bool uniform = false;
45         if (L.size() > 1 && contiguous<T>())
46         {
47             uniform = true;
49             forAll(L, i)
50             {
51                 if (L[i] != L[0])
52                 {
53                     uniform = false;
54                     break;
55                 }
56             }
57         }
59         if (uniform)
60         {
61             // Write size and start delimiter
62             os << L.size() << token::BEGIN_BLOCK;
64             // Write contents
65             os << L[0];
67             // Write end delimiter
68             os << token::END_BLOCK;
69         }
70         else if (L.size() < 11 && contiguous<T>())
71         {
72             // Write size and start delimiter
73             os << L.size() << token::BEGIN_LIST;
75             // Write contents
76             forAll(L, i)
77             {
78                 if (i) os << token::SPACE;
79                 os << L[i];
80             }
82             // Write end delimiter
83             os << token::END_LIST;
84         }
85         else
86         {
87             // Write size and start delimiter
88             os << nl << L.size() << nl << token::BEGIN_LIST;
90             // Write contents
91             forAll(L, i)
92             {
93                 os << nl << L[i];
94             }
96             // Write end delimiter
97             os << nl << token::END_LIST << nl;
98         }
99     }
100     else
101     {
102         // this is annoying, and wasteful, but there's currently no alternative
104         os << nl << L.size() << nl;
106         if (L.size())
107         {
108             List<T> lst = L();
110             os.write
111             (
112                 reinterpret_cast<const char*>(lst.cdata()),
113                 lst.byteSize()
114             );
115         }
116     }
118     // Check state of IOstream
119     os.check("Ostream& operator<<(Ostream&, const UIndirectList&)");
121     return os;
125 // ************************************************************************* //