cisst-saw
Toggle main menu visibility
Loading...
Searching...
No Matches
tmp
cisst-saw
cisst
cisstCommon
cmnMultiplexerStreambuf.h
Go to the documentation of this file.
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3
4
/*
5
6
Author(s): Ofri Sadowsky
7
Created on: 2002-04-19
8
9
(C) Copyright 2002-2007 Johns Hopkins University (JHU), All Rights
10
Reserved.
11
12
--- begin cisst license - do not edit ---
13
14
This software is provided "as is" under an open source license, with
15
no warranty. The complete license can be found in license.txt and
16
http://www.cisst.org/cisst/license.txt.
17
18
--- end cisst license ---
19
20
*/
21
22
26
#pragma once
27
28
#ifndef _cmnMultiplexerStreambuf_h
29
#define _cmnMultiplexerStreambuf_h
30
31
#include <
cisstCommon/cmnPortability.h
>
32
33
#include <list>
34
#include <algorithm>
35
93
template
<
class
_element,
class
_trait = std::
char
_traits<_element> >
94
class
cmnMultiplexerStreambuf
:
public
std::basic_streambuf<_element, _trait>
95
{
96
public
:
97
98
typedef
std::basic_streambuf<_element, _trait>
ChannelType
;
99
typedef
typename
std::basic_streambuf<_element, _trait>::int_type
int_type
;
100
104
typedef
std::list<ChannelType *>
ChannelContainerType
;
105
109
cmnMultiplexerStreambuf
()
110
{}
111
115
void
AddChannel
(
ChannelType
*channel);
116
122
void
RemoveChannel
(
ChannelType
* channel);
123
129
const
ChannelContainerType
&
GetChannels
()
const
130
{
131
return
m_ChannelContainer;
132
}
133
134
135
// Here we override the basic_streambuf methods for multiplexing.
136
// This part is declared 'protected' following the declarations of
137
// basic_streambuf. See basic_streambuf documentation for more
138
// details.
139
protected
:
140
142
virtual
std::streamsize
xsputn
(
const
_element *s, std::streamsize n);
143
145
virtual
int
sync
();
146
151
virtual
int_type
overflow
(
int_type
c = _trait::eof());
152
153
private
:
155
ChannelContainerType
m_ChannelContainer;
156
157
};
158
159
160
//********************************
161
// Template method implementation
162
//********************************
163
164
165
template
<
class
_element,
class
_trait>
166
void
cmnMultiplexerStreambuf<_element, _trait>::AddChannel
(
ChannelType
* channel)
167
{
168
typename
ChannelContainerType::iterator it = find(m_ChannelContainer.begin(), m_ChannelContainer.end(),
169
channel);
170
171
if
(it == m_ChannelContainer.end()) {
172
m_ChannelContainer.insert(it, channel);
173
}
174
}
175
176
177
template
<
class
_element,
class
_trait>
178
void
cmnMultiplexerStreambuf<_element, _trait>::RemoveChannel
(
ChannelType
* channel)
179
{
180
m_ChannelContainer.remove(channel);
181
}
182
183
184
template
<
class
_element,
class
_trait>
185
std::streamsize
cmnMultiplexerStreambuf<_element, _trait>::xsputn
(
const
_element *s, std::streamsize n)
186
{
187
std::streamsize ssize;
188
typename
ChannelContainerType::iterator it;
189
for
(it = m_ChannelContainer.begin(); it != m_ChannelContainer.end(); it++) {
190
ssize = (*it)->sputn(s, n);
191
}
192
return
ssize;
193
}
194
195
196
template
<
class
_element,
class
_trait>
197
int
cmnMultiplexerStreambuf<_element, _trait>::sync
()
198
{
199
typename
ChannelContainerType::iterator it;
200
// synchronize all the channels
201
for
(it = m_ChannelContainer.begin(); it != m_ChannelContainer.end(); it++) {
202
(*it)->pubsync();
203
}
204
return
0;
205
}
206
207
208
template
<
class
_element,
class
_trait>
209
typename
cmnMultiplexerStreambuf<_element, _trait>::int_type
210
cmnMultiplexerStreambuf<_element, _trait>::overflow
(
int_type
c)
211
{
212
// follow the basic_streambuf standard
213
if
(_trait::eq_int_type(_trait::eof(), c))
214
return
(_trait::not_eof(c));
215
216
typename
ChannelContainerType::iterator it;
217
218
// multiplexing
219
for
(it = m_ChannelContainer.begin(); it != m_ChannelContainer.end(); it++) {
220
(*it)->sputc(_trait::to_char_type(c));
221
}
222
223
// follow the basic_streambuf standard
224
return
_trait::not_eof(c);
225
}
226
227
228
#endif
// _cmnMultiplexerStreambuf_h
229
cmnMultiplexerStreambuf::int_type
std::basic_streambuf< _element, _trait >::int_type int_type
Definition
cmnMultiplexerStreambuf.h:99
cmnMultiplexerStreambuf::xsputn
virtual std::streamsize xsputn(const _element *s, std::streamsize n)
Definition
cmnMultiplexerStreambuf.h:185
cmnMultiplexerStreambuf::AddChannel
void AddChannel(ChannelType *channel)
Definition
cmnMultiplexerStreambuf.h:166
cmnMultiplexerStreambuf::ChannelContainerType
std::list< ChannelType * > ChannelContainerType
Definition
cmnMultiplexerStreambuf.h:104
cmnMultiplexerStreambuf::sync
virtual int sync()
Definition
cmnMultiplexerStreambuf.h:197
cmnMultiplexerStreambuf::cmnMultiplexerStreambuf
cmnMultiplexerStreambuf()
Definition
cmnMultiplexerStreambuf.h:109
cmnMultiplexerStreambuf::ChannelType
std::basic_streambuf< _element, _trait > ChannelType
Definition
cmnMultiplexerStreambuf.h:98
cmnMultiplexerStreambuf::overflow
virtual int_type overflow(int_type c=_trait::eof())
Definition
cmnMultiplexerStreambuf.h:210
cmnMultiplexerStreambuf::GetChannels
const ChannelContainerType & GetChannels() const
Definition
cmnMultiplexerStreambuf.h:129
cmnMultiplexerStreambuf::RemoveChannel
void RemoveChannel(ChannelType *channel)
Definition
cmnMultiplexerStreambuf.h:178
cmnPortability.h
Portability across compilers and operating systems tools.
Generated by
1.18.0