Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / db / IOstreams / Pstreams / OPstream.C
blobbf3e3ab66b07c0adabe3756390f086b6afce1462
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 Description
25     Write primitive and binary block from OPstream
27 \*---------------------------------------------------------------------------*/
29 #include "error.H"
31 #include "OPstream.H"
32 #include "int.H"
33 #include "token.H"
35 #include <cctype>
37 // * * * * * * * * * * * * * Private member functions  * * * * * * * * * * * //
39 template<class T>
40 inline void Foam::OPstream::writeToBuffer(const T& t)
42     writeToBuffer(&t, sizeof(T), sizeof(T));
46 inline void Foam::OPstream::writeToBuffer(const char& c)
48     if (size_t(buf_.size()) < bufPosition_ + 1U)
49     {
50         enlargeBuffer(1);
51     }
53     buf_[bufPosition_] = c;
54     bufPosition_ ++;
58 inline void Foam::OPstream::writeToBuffer
60     const void* data,
61     size_t count,
62     size_t align
65     label oldPos = bufPosition_;
67     if (align > 1)
68     {
69         // Align bufPosition. Pads bufPosition_ - oldPos characters.
70         bufPosition_ = align + ((bufPosition_ - 1) & ~(align - 1));
71     }
73     if (size_t(buf_.size()) < bufPosition_ + count)
74     {
75         enlargeBuffer(bufPosition_ - oldPos + count);
76     }
78     register char* bufPtr = &buf_[bufPosition_];
79     register const char* dataPtr = reinterpret_cast<const char*>(data);
80     register size_t i = count;
81     while (i--) *bufPtr++ = *dataPtr++;
83     bufPosition_ += count;
88 // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
90 Foam::OPstream::OPstream
92     const commsTypes commsType,
93     const int toProcNo,
94     const label bufSize,
95     streamFormat format,
96     versionNumber version
99     Pstream(commsType, bufSize),
100     Ostream(format, version),
101     toProcNo_(toProcNo)
103     setOpened();
104     setGood();
106     if (!bufSize)
107     {
108         buf_.setSize(1000);
109     }
113 // * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
115 Foam::Ostream& Foam::OPstream::write(const token&)
117     notImplemented("Ostream& OPstream::write(const token&)");
118     setBad();
119     return *this;
123 Foam::Ostream& Foam::OPstream::write(const char c)
125     if (!isspace(c))
126     {
127         writeToBuffer(c);
128     }
130     return *this;
134 Foam::Ostream& Foam::OPstream::write(const char* str)
136     word nonWhiteChars(string::validate<word>(str));
138     if (nonWhiteChars.size() == 1)
139     {
140         return write(nonWhiteChars.c_str()[1]);
141     }
142     else if (nonWhiteChars.size())
143     {
144         return write(nonWhiteChars);
145     }
146     else
147     {
148         return *this;
149     }
153 Foam::Ostream& Foam::OPstream::write(const word& str)
155     write(char(token::WORD));
157     size_t len = str.size();
158     writeToBuffer(len);
159     writeToBuffer(str.c_str(), len + 1, 1);
161     return *this;
165 Foam::Ostream& Foam::OPstream::write(const string& str)
167     write(char(token::STRING));
169     size_t len = str.size();
170     writeToBuffer(len);
171     writeToBuffer(str.c_str(), len + 1, 1);
173     return *this;
177 Foam::Ostream& Foam::OPstream::writeQuoted(const std::string& str, const bool)
179     write(char(token::STRING));
181     size_t len = str.size();
182     writeToBuffer(len);
183     writeToBuffer(str.c_str(), len + 1, 1);
185     return *this;
189 Foam::Ostream& Foam::OPstream::write(const label val)
191     write(char(token::LABEL));
192     writeToBuffer(val);
193     return *this;
197 Foam::Ostream& Foam::OPstream::write(const floatScalar val)
199     write(char(token::FLOAT_SCALAR));
200     writeToBuffer(val);
201     return *this;
205 Foam::Ostream& Foam::OPstream::write(const doubleScalar val)
207     write(char(token::DOUBLE_SCALAR));
208     writeToBuffer(val);
209     return *this;
213 Foam::Ostream& Foam::OPstream::write(const longDoubleScalar val)
215     write(char(token::LONG_DOUBLE_SCALAR));
216     writeToBuffer(val);
217     return *this;
221 Foam::Ostream& Foam::OPstream::write(const char* data, std::streamsize count)
223     if (format() != BINARY)
224     {
225         FatalErrorIn("Ostream::write(const char*, std::streamsize)")
226             << "stream format not binary"
227             << Foam::abort(FatalError);
228     }
230     writeToBuffer(data, count, 8);
232     return *this;
236 // ************************************************************************* //