STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Public Types | Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits > Class Template Reference
Inheritance diagram for stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >:

Public Types

typedef wbuffer_convert< _Codecvt, _Elem, _Traits > _Myt
 
typedef _STD streambuf _Mysb
 
typedef _STD char_traits< char_Byte_traits
 
typedef _Traits::int_type int_type
 
typedef _Traits::pos_type pos_type
 
typedef _Traits::off_type off_type
 
typedef _Traits::state_type state_type
 

Public Member Functions

 wbuffer_convert (_Mysb *_Strbuf=0)
 
 wbuffer_convert (_Mysb *_Strbuf, _Codecvt *_Pcvt_arg)
 
 wbuffer_convert (_Mysb *_Strbuf, _Codecvt *_Pcvt_arg, state_type _State_arg)
 
virtual ~wbuffer_convert () _NOEXCEPT
 
_Mysbrdbuf () const
 
_Mysbrdbuf (_Mysb *_Strbuf)
 
state_type state () const
 
 wbuffer_convert (const _Myt &)=delete
 
_Mytoperator= (const _Myt &)=delete
 

Protected Member Functions

virtual int_type overflow (int_type _Meta=_Traits::eof())
 
virtual int_type pbackfail (int_type _Meta=_Traits::eof())
 
virtual int_type underflow ()
 
virtual int_type uflow ()
 
virtual pos_type seekoff (off_type, _STD ios::seekdir, _STD ios::openmode=(_STD ios::openmode)(_STD ios::in|_STD ios::out))
 
virtual pos_type seekpos (pos_type, _STD ios::openmode=(_STD ios::openmode)(_STD ios::in|_STD ios::out))
 

Private Types

enum  _Mode {
  _Unused, _Wrote, _Need, _Got,
  _Eof
}
 
enum  { _STRING_INC = 8 }
 

Private Member Functions

int_type _Get_elem ()
 

Private Attributes

state_type _State
 
_Codecvt * _Pcvt
 
_Mysb_Mystrbuf
 
_Mode _Status
 
size_t _Nback
 
_Elem _Myback [8]
 
_STD string _Str
 
_STD locale _Loc
 

Member Typedef Documentation

template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
typedef _STD char_traits<char> stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Byte_traits
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
typedef _STD streambuf stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Mysb
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
typedef wbuffer_convert<_Codecvt, _Elem, _Traits> stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Myt
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
typedef _Traits::int_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::int_type
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
typedef _Traits::off_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::off_type
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
typedef _Traits::pos_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::pos_type
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
typedef _Traits::state_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::state_type

Member Enumeration Documentation

template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
anonymous enum
private
Enumerator
_STRING_INC 
33 {_STRING_INC = 8};
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
enum stdext::cvt::wbuffer_convert::_Mode
private
Enumerator
_Unused 
_Wrote 
_Need 
_Got 
_Eof 

Constructor & Destructor Documentation

template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::wbuffer_convert ( _Mysb _Strbuf = 0)
inlineexplicit
46  : _Pcvt(new _Codecvt),
47  _Mystrbuf(_Strbuf), _Status(_Unused), _Nback(0)
48  { // construct with byte stream buffer pointer
49  static state_type _State0;
50 
51  _State = _State0;
53  }
_Mode _Status
Definition: wbuffer:318
state_type _State
Definition: wbuffer:315
size_t _Nback
Definition: wbuffer:319
_Mysb * _Mystrbuf
Definition: wbuffer:317
_Traits::state_type state_type
Definition: wbuffer:43
#define _ADDFAC(loc, pfac)
Definition: xlocale:497
_STD locale _Loc
Definition: wbuffer:322
_Codecvt * _Pcvt
Definition: wbuffer:316
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::wbuffer_convert ( _Mysb _Strbuf,
_Codecvt *  _Pcvt_arg 
)
inline
56  : _Pcvt(_Pcvt_arg),
57  _Mystrbuf(_Strbuf), _Status(_Unused), _Nback(0)
58  { // construct with byte stream buffer pointer and codecvt
59  static state_type _State0;
60 
61  _State = _State0;
63  }
_Mode _Status
Definition: wbuffer:318
state_type _State
Definition: wbuffer:315
size_t _Nback
Definition: wbuffer:319
_Mysb * _Mystrbuf
Definition: wbuffer:317
_Traits::state_type state_type
Definition: wbuffer:43
#define _ADDFAC(loc, pfac)
Definition: xlocale:497
_STD locale _Loc
Definition: wbuffer:322
_Codecvt * _Pcvt
Definition: wbuffer:316
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::wbuffer_convert ( _Mysb _Strbuf,
_Codecvt *  _Pcvt_arg,
state_type  _State_arg 
)
inline
67  : _Pcvt(_Pcvt_arg),
68  _Mystrbuf(_Strbuf), _Status(_Unused), _Nback(0)
69  { // construct with byte stream buffer pointer, codecvt, and state
70  _State = _State_arg;
72  }
_Mode _Status
Definition: wbuffer:318
state_type _State
Definition: wbuffer:315
size_t _Nback
Definition: wbuffer:319
_Mysb * _Mystrbuf
Definition: wbuffer:317
#define _ADDFAC(loc, pfac)
Definition: xlocale:497
_STD locale _Loc
Definition: wbuffer:322
_Codecvt * _Pcvt
Definition: wbuffer:316
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
virtual stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::~wbuffer_convert ( )
inlinevirtual
75  { // destroy the object
76  char *_Buf = (char *)_Str.c_str();
77 
78  for (; _Status == _Wrote ; )
79  { // put any trailing homing shift
80  char *_Dest;
81 
82  if (_Str.size() < _STRING_INC)
83  _Str.assign(_STRING_INC, '\0');
84  switch (_Pcvt->unshift(_State,
85  _Buf, _Buf + _Str.size(), _Dest))
86  { // test result of homing conversion
87  case _Codecvt::ok:
88  _Status = _Unused; // homed successfully
89 
90  case _Codecvt::partial: // fall through
91  { // put any generated bytes
92  size_t _Count = _Dest - _Buf;
93  if (0 < _Count
94  && _Byte_traits::eq_int_type(
95  _Byte_traits::eof(),
96  (typename _Traits::int_type)_Mystrbuf->sputn(
97  _Buf,
98  (_STD streamsize)_Count)))
99  return; // write failed
100 
101  if (_Status == _Wrote && _Count == 0)
102  _Str.append(_STRING_INC, '\0'); // try with more space
103  break;
104  }
105 
106  case _Codecvt::noconv:
107  return; // nothing to do
108 
109  default:
110  return; // conversion failed
111  }
112  }
113 
114  }
_Mode _Status
Definition: wbuffer:318
_Ret_z_ const _Elem * c_str() const _NOEXCEPT
Definition: xstring:3001
long long streamsize
Definition: iosfwd:23
state_type _State
Definition: wbuffer:315
Definition: regex:1559
unsigned _Dest
Definition: mbstring.h:107
_Mysb * _Mystrbuf
Definition: wbuffer:317
_Myt & assign(_Myt &&_Right) _NOEXCEPT_OP(_Alty
Definition: xstring:2090
_Myt & append(initializer_list< _Elem > _Ilist)
Definition: xstring:2199
_STD string _Str
Definition: wbuffer:321
size_type size() const _NOEXCEPT
Definition: xstring:3023
_Diff _Count
Definition: algorithm:1941
_Codecvt * _Pcvt
Definition: wbuffer:316
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::wbuffer_convert ( const _Myt )
delete

Member Function Documentation

template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
int_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Get_elem ( )
inlineprivate
261  { // compose an element from byte stream buffer
262  if (_Mystrbuf != 0 && _Status != _Wrote)
263  { // got buffer, haven't written, try to compose an element
264  if (_Status == _Eof)
265  ;
266  else if (_Str.size() == 0)
267  _Status = _Need;
268  else
269  _Status = _Got;
270 
271  for (; _Status != _Eof; )
272  { // get using codecvt facet
273  char *_Buf = (char *)_Str.c_str();
274  _Elem _Ch, *_Dest;
275  const char *_Src;
276  int _Meta;
277 
278  if (_Status != _Need)
279  ;
280  else if (_Byte_traits::eq_int_type(_Byte_traits::eof(),
281  _Meta = _Mystrbuf->sbumpc()))
282  _Status = _Eof;
283  else
284  _Str.append(1, _Byte_traits::to_char_type(_Meta));
285 
286  switch (_Pcvt->in(_State,
287  _Buf, _Buf + _Str.size(), _Src,
288  &_Ch, &_Ch + 1, _Dest))
289  { // test result of converting one element
290  case _Codecvt::partial:
291  case _Codecvt::ok:
292  _Str.erase((size_t)0, // discard any used input
293  (size_t)(_Src - _Buf));
294  if (_Dest != &_Ch)
295  return (_Traits::to_int_type(_Ch));
296  break;
297 
298  case _Codecvt::noconv:
299  if (_Str.size() < sizeof (_Elem))
300  break; // no conversion, but need more chars
301  _CSTD memcpy(&_Ch, _Buf,
302  sizeof (_Elem)); // copy raw bytes to element
303  _Str.erase((size_t)0, sizeof (_Elem));
304  return (_Traits::to_int_type(_Ch)); // return result
305 
306  default:
307  _Status = _Eof; // conversion failed
308  }
309  }
310  }
311 
312  return (_Traits::eof());
313  }
_Mode _Status
Definition: wbuffer:318
_Ret_z_ const _Elem * c_str() const _NOEXCEPT
Definition: xstring:3001
state_type _State
Definition: wbuffer:315
Definition: regex:1559
unsigned _Dest
Definition: mbstring.h:107
_Mysb * _Mystrbuf
Definition: wbuffer:317
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
_Myt & append(initializer_list< _Elem > _Ilist)
Definition: xstring:2199
_In_ size_t _Out_opt_ int _In_z_ unsigned char const * _Src
Definition: mbstring.h:1039
_Myt & erase(const size_type _Off=0)
Definition: xstring:2584
memcpy(_Destination, _Source, _SourceSize)
_STD string _Str
Definition: wbuffer:321
size_type size() const _NOEXCEPT
Definition: xstring:3023
#define _CSTD
Definition: yvals.h:570
_Codecvt * _Pcvt
Definition: wbuffer:316
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_Myt& stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::operator= ( const _Myt )
delete
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
virtual int_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::overflow ( int_type  _Meta = _Traits::eof())
inlineprotectedvirtual
138  { // put an element to stream
139  if (_Traits::eq_int_type(_Traits::eof(), _Meta))
140  return (_Traits::not_eof(_Meta)); // EOF, return success code
141  else if (_Mystrbuf == 0 || 0 < _Nback
142  || (_Status != _Unused && _Status != _Wrote))
143  return (_Traits::eof()); // no buffer or reading, fail
144  else
145  { // put using codecvt facet
146  char *_Buf = (char *)_Str.c_str();
147  const _Elem _Ch = _Traits::to_char_type(_Meta);
148  const _Elem *_Src;
149  char *_Dest;
150 
151  if (_Str.size() < _STRING_INC)
152  _Str.assign(_STRING_INC, '\0');
153  for (_Status = _Wrote; ; )
154  switch (_Pcvt->out(_State,
155  &_Ch, &_Ch + 1, _Src,
156  _Buf, _Buf + _Str.size(), _Dest))
157  { // test result of converting one element
158  case _Codecvt::partial:
159  case _Codecvt::ok:
160  { // converted something, try to put it out
161  size_t _Count = _Dest - _Buf;
162  if (0 < _Count
163  && _Byte_traits::eq_int_type(
164  _Byte_traits::eof(),
165  (typename _Traits::int_type)_Mystrbuf->sputn(
166  _Buf,
167  (_STD streamsize)_Count)))
168  return (_Traits::eof()); // write failed
169 
170  if (_Src != &_Ch)
171  return (_Meta); // converted whole element
172 
173  if (0 < _Count)
174  ;
175  else if (_Str.size() < 4 * _STRING_INC)
176  _Str.append(_STRING_INC, '\0'); // try with more space
177  else
178  return (_Traits::eof()); // conversion failed
179  break;
180  }
181 
182  case _Codecvt::noconv:
183  if (_Traits::eq_int_type(
184  _Traits::eof(),
185  (typename _Traits::int_type)_Mystrbuf->sputn(
186  (char *)&_Ch,
187  (_STD streamsize)sizeof (_Elem))))
188  return (_Traits::eof());
189  else
190  return (_Meta); // put native byte order
191 
192  default:
193  return (_Traits::eof()); // conversion failed
194  }
195  }
196  }
_Mode _Status
Definition: wbuffer:318
_Ret_z_ const _Elem * c_str() const _NOEXCEPT
Definition: xstring:3001
long long streamsize
Definition: iosfwd:23
state_type _State
Definition: wbuffer:315
Definition: regex:1559
unsigned _Dest
Definition: mbstring.h:107
size_t _Nback
Definition: wbuffer:319
_Mysb * _Mystrbuf
Definition: wbuffer:317
_Check_return_ _In_ wchar_t _Ch
Definition: vcruntime_string.h:89
_Myt & assign(_Myt &&_Right) _NOEXCEPT_OP(_Alty
Definition: xstring:2090
_Myt & append(initializer_list< _Elem > _Ilist)
Definition: xstring:2199
_In_ size_t _Out_opt_ int _In_z_ unsigned char const * _Src
Definition: mbstring.h:1039
_STD string _Str
Definition: wbuffer:321
size_type size() const _NOEXCEPT
Definition: xstring:3023
_Diff _Count
Definition: algorithm:1941
_Codecvt * _Pcvt
Definition: wbuffer:316
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
virtual int_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::pbackfail ( int_type  _Meta = _Traits::eof())
inlineprotectedvirtual
199  { // put an element back to stream
200  if (sizeof (_Myback) / sizeof (_Myback[0]) <= _Nback
201  || _Status == _Wrote)
202  return (_Traits::eof()); // nowhere to put back
203  else
204  { // enough room, put it back
205  if (!_Traits::eq_int_type(_Traits::eof(), _Meta))
206  _Myback[_Nback] = _Traits::to_char_type(_Meta);
207  ++_Nback;
208  if (_Status == _Unused)
209  _Status = _Got;
210  return (_Meta);
211  }
212  }
_Mode _Status
Definition: wbuffer:318
size_t _Nback
Definition: wbuffer:319
_Elem _Myback[8]
Definition: wbuffer:320
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_Mysb* stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::rdbuf ( ) const
inline
117  { // return byte stream buffer pointer
118  return (_Mystrbuf);
119  }
_Mysb * _Mystrbuf
Definition: wbuffer:317
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_Mysb* stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::rdbuf ( _Mysb _Strbuf)
inline
122  { // set byte stream buffer pointer
123  _Mysb *_Oldstrbuf = _Mystrbuf;
124  _Mystrbuf = _Strbuf;
125  return (_Oldstrbuf);
126  }
_Mysb * _Mystrbuf
Definition: wbuffer:317
_STD streambuf _Mysb
Definition: wbuffer:37
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
virtual pos_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::seekoff ( off_type  ,
_STD ios::seekdir  ,
_STD ios::openmode  = (_STD ios::openmode)(_STD ios::in | _STD ios::out) 
)
inlineprotectedvirtual
248  { // change position by _Off
249  return (pos_type(-1)); // always fail
250  }
_Traits::pos_type pos_type
Definition: wbuffer:41
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
virtual pos_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::seekpos ( pos_type  ,
_STD ios::openmode  = (_STD ios::openmode)(_STD ios::in | _STD ios::out) 
)
inlineprotectedvirtual
255  { // change position to _Pos
256  return (pos_type(-1)); // always fail
257  }
_Traits::pos_type pos_type
Definition: wbuffer:41
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
state_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::state ( ) const
inline
129  { // get state
130  return (_State);
131  }
state_type _State
Definition: wbuffer:315
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
virtual int_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::uflow ( )
inlineprotectedvirtual
231  { // get an element from stream, point past it
232  int_type _Meta;
233 
234  if (0 < _Nback)
235  ;
236  else if (_Traits::eq_int_type(_Traits::eof(), _Meta = _Get_elem()))
237  return (_Meta); // _Get_elem failed, return EOF
238  else
239  _Myback[_Nback++] = _Traits::to_char_type(_Meta);
240  return (_Traits::to_int_type(_Myback[--_Nback]));
241  }
_Traits::int_type int_type
Definition: wbuffer:40
int_type _Get_elem()
Definition: wbuffer:260
size_t _Nback
Definition: wbuffer:319
_Elem _Myback[8]
Definition: wbuffer:320
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
virtual int_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::underflow ( )
inlineprotectedvirtual
215  { // get an element from stream, but don't point past it
216  int_type _Meta;
217 
218  if (0 < _Nback)
219  ;
220  else if (_Traits::eq_int_type(_Traits::eof(), _Meta = _Get_elem()))
221  return (_Meta); // _Get_elem failed, return EOF
222  else
223  _Myback[_Nback++] = _Traits::to_char_type(_Meta);
224  return (_Traits::to_int_type(_Myback[_Nback - 1]));
225  }
_Traits::int_type int_type
Definition: wbuffer:40
int_type _Get_elem()
Definition: wbuffer:260
size_t _Nback
Definition: wbuffer:319
_Elem _Myback[8]
Definition: wbuffer:320

Member Data Documentation

template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_STD locale stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Loc
private
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_Elem stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Myback[8]
private
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_Mysb* stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Mystrbuf
private
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
size_t stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Nback
private
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_Codecvt* stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Pcvt
private
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
state_type stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_State
private
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_Mode stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Status
private
template<class _Codecvt, class _Elem = wchar_t, class _Traits = _STD char_traits<_Elem>>
_STD string stdext::cvt::wbuffer_convert< _Codecvt, _Elem, _Traits >::_Str
private

The documentation for this class was generated from the following file: