lsst.astshim
gf5dcc679e7+7aca86229d
Toggle main menu visibility
Loading...
Searching...
No Matches
include
astshim
Stream.h
Go to the documentation of this file.
1
/*
2
* LSST Data Management System
3
* Copyright 2017 AURA/LSST.
4
*
5
* This product includes software developed by the
6
* LSST Project (http://www.lsst.org/).
7
*
8
* This program is free software: you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation, either version 3 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the LSST License Statement and
19
* the GNU General Public License along with this program. If not,
20
* see <https://www.lsstcorp.org/LegalNotices/>.
21
*/
22
#ifndef ASTSHIM_SOURCESINK_H
23
#define ASTSHIM_SOURCESINK_H
24
25
#include <string>
26
#include <fstream>
27
#include <sstream>
28
#include <iostream>
29
30
#include "
astshim/base.h
"
31
#include "
astshim/detail/utils.h
"
32
#include "
astshim/Object.h
"
33
34
namespace
ast
{
35
36
class
Channel
;
// forward declaration for friendship
37
41
class
Stream
{
42
public
:
51
explicit
Stream
(
std::istream
*istreamPtr,
std::ostream
*ostreamPtr)
52
:
_istreamPtr
(),
_ostreamPtr
(),
_sourceStr
(),
_isFits
(false) {
53
if
(istreamPtr) {
54
_istreamPtr
=
std::make_shared<std::istream>
(istreamPtr->
rdbuf
());
55
}
56
if
(ostreamPtr) {
57
_ostreamPtr
=
std::make_shared<std::ostream>
(ostreamPtr->
rdbuf
());
58
}
59
}
60
61
explicit
Stream
() :
Stream
(nullptr, nullptr) {}
62
63
virtual
~Stream
() {}
64
65
Stream
(
Stream
const
&) =
default
;
66
Stream
(
Stream
&&) =
default
;
67
Stream
&
operator=
(
Stream
const
&) =
default
;
68
Stream
&
operator=
(
Stream
&&) =
default
;
69
73
bool
hasStdStream
() {
return
_istreamPtr
||
_ostreamPtr
; }
74
84
char
const
*
source
() {
85
if
((
_istreamPtr
) && (*
_istreamPtr
)) {
86
if
(
_isFits
) {
87
// http://codereview.stackexchange.com/a/28759
88
_sourceStr
.resize(detail::FITSLEN);
89
_istreamPtr
->read(&
_sourceStr
[0], detail::FITSLEN);
90
}
else
{
91
std::getline
(*
_istreamPtr
,
_sourceStr
);
92
}
93
if
(*
_istreamPtr
) {
94
return
_sourceStr
.c_str();
95
}
96
}
97
return
nullptr
;
98
}
99
110
bool
sink
(
char
const
*cstr) {
111
if
(
_ostreamPtr
) {
112
(*_ostreamPtr) << cstr;
113
if
(!
_isFits
) {
114
(*_ostreamPtr) <<
std::endl
;
115
}
116
return
static_cast<
bool
>
(*_ostreamPtr);
117
}
else
{
118
return
true
;
119
}
120
}
121
122
friend
class
Channel
;
123
125
bool
getIsFits
()
const
{
return
_isFits
; }
126
127
protected
:
129
void
setIsFits
(
bool
isFits) {
_isFits
= isFits; }
130
131
std::shared_ptr<std::istream>
_istreamPtr
;
132
std::shared_ptr<std::ostream>
_ostreamPtr
;
135
std::string
_sourceStr
;
136
bool
_isFits
;
137
};
138
142
class
FileStream
:
public
Stream
{
143
public
:
150
explicit
FileStream
(
std::string
const
&path,
bool
doWrite =
false
) :
Stream
(), _path(path) {
151
auto
mode = doWrite ? std::ios_base::out : std::ios_base::in;
152
auto
fstreamPtr =
std::make_shared<std::fstream>
(path, mode);
153
if
(!*fstreamPtr) {
154
std::ostringstream
os;
155
os <<
"Failed to open file \""
<< path <<
"\" for "
<< (doWrite ?
"writing"
:
"reading"
);
156
throw
std::runtime_error
(os.
str
());
157
}
158
if
(doWrite) {
159
_ostreamPtr
= fstreamPtr;
160
}
else
{
161
_istreamPtr
= fstreamPtr;
162
}
163
}
164
165
virtual
~FileStream
() {}
166
168
std::string
getPath
()
const
{
return
_path; }
169
170
private
:
171
std::string
_path;
172
};
173
180
class
StringStream
:
public
Stream
{
181
public
:
187
explicit
StringStream
(
std::string
const
&data =
""
) :
Stream
(), _istringstreamPtr(), _ostringstreamPtr() {
188
_istringstreamPtr =
std::make_shared<std::istringstream>
(data);
189
_ostringstreamPtr =
std::make_shared<std::ostringstream>
();
190
_istreamPtr
= _istringstreamPtr;
191
_ostreamPtr
= _ostringstreamPtr;
192
}
193
194
virtual
~StringStream
() {}
195
197
std::string
getSourceData
()
const
{
return
_istringstreamPtr->str(); }
198
200
std::string
getSinkData
()
const
{
return
_ostringstreamPtr->str(); }
201
203
void
sinkToSource
() {
204
_istringstreamPtr->clear();
205
_istringstreamPtr->str(
getSinkData
());
206
_ostringstreamPtr->str(
""
);
207
}
208
209
private
:
211
std::shared_ptr<std::istringstream>
_istringstreamPtr;
213
std::shared_ptr<std::ostringstream>
_ostringstreamPtr;
214
};
215
216
namespace
detail {
217
224
inline
const
char
*
source
() {
225
auto
ssptr =
reinterpret_cast<
Stream
*
>
(astChannelData);
226
if
(ssptr) {
227
return
ssptr->source();
228
}
else
{
229
return
nullptr
;
230
}
231
}
232
239
inline
void
sink
(
const
char
*cstr) {
240
auto
ssptr =
reinterpret_cast<
Stream
*
>
(astChannelData);
241
if
(ssptr) {
242
auto
isok = ssptr->sink(cstr);
243
if
(!isok) {
244
astSetStatus(AST__ATGER);
245
}
246
}
247
}
248
249
}
// namespace detail
250
251
}
// namespace ast
252
253
#endif
Object.h
base.h
std::istream
std::ostream
std::ostringstream
std::string
ast::Channel
Channel provides input/output of AST objects.
Definition
Channel.h:60
ast::FileStream::~FileStream
virtual ~FileStream()
Definition
Stream.h:165
ast::FileStream::FileStream
FileStream(std::string const &path, bool doWrite=false)
Construct a FileStream for reading or writing, but not both.
Definition
Stream.h:150
ast::FileStream::getPath
std::string getPath() const
Get the path to the file, as a string.
Definition
Stream.h:168
ast::Stream
A stream for ast::Channel.
Definition
Stream.h:41
ast::Stream::Stream
Stream()
Definition
Stream.h:61
ast::Stream::getIsFits
bool getIsFits() const
get isfits
Definition
Stream.h:125
ast::Stream::_isFits
bool _isFits
is this a FITS stream?
Definition
Stream.h:136
ast::Stream::Stream
Stream(Stream const &)=default
ast::Stream::hasStdStream
bool hasStdStream()
Return true if this Stream has an input or output std::stream.
Definition
Stream.h:73
ast::Stream::_sourceStr
std::string _sourceStr
string containing a local copy of sourced data, so source can return a char * that won't disappear ri...
Definition
Stream.h:135
ast::Stream::Stream
Stream(std::istream *istreamPtr, std::ostream *ostreamPtr)
Construct a Stream from input and output std::streams.
Definition
Stream.h:51
ast::Stream::sink
bool sink(char const *cstr)
Sink (write) to the stream.
Definition
Stream.h:110
ast::Stream::operator=
Stream & operator=(Stream const &)=default
ast::Stream::_ostreamPtr
std::shared_ptr< std::ostream > _ostreamPtr
output stream
Definition
Stream.h:132
ast::Stream::operator=
Stream & operator=(Stream &&)=default
ast::Stream::_istreamPtr
std::shared_ptr< std::istream > _istreamPtr
input stream
Definition
Stream.h:131
ast::Stream::Channel
friend class Channel
Definition
Stream.h:122
ast::Stream::Stream
Stream(Stream &&)=default
ast::Stream::source
char const * source()
Source (read) from the stream.
Definition
Stream.h:84
ast::Stream::~Stream
virtual ~Stream()
Definition
Stream.h:63
ast::Stream::setIsFits
void setIsFits(bool isFits)
set isFits
Definition
Stream.h:129
ast::StringStream::getSourceData
std::string getSourceData() const
Get a copy of the text from the sink/output stream, without changing the stream.
Definition
Stream.h:197
ast::StringStream::StringStream
StringStream(std::string const &data="")
Construct a StringStream.
Definition
Stream.h:187
ast::StringStream::sinkToSource
void sinkToSource()
Move output/sink data to input/source.
Definition
Stream.h:203
ast::StringStream::getSinkData
std::string getSinkData() const
Get a copy of the text from the sink/output stream, without changing the stream.
Definition
Stream.h:200
ast::StringStream::~StringStream
virtual ~StringStream()
Definition
Stream.h:194
std::endl
T endl(T... args)
std::getline
T getline(T... args)
std::make_shared
T make_shared(T... args)
ast::detail::source
const char * source()
Source function that allows astChannel to source from a Stream.
Definition
Stream.h:224
ast::detail::sink
void sink(const char *cstr)
Sink function that allows astChannel to sink to a Stream.
Definition
Stream.h:239
ast
AST wrapper classes and functions.
Definition
attributes_channel.dox:1
std::istream::rdbuf
T rdbuf(T... args)
std::runtime_error
std::shared_ptr
std::ostringstream::str
T str(T... args)
utils.h
Generated on
for lsst.astshim by
1.17.0