epoc32/include/stdapis/stlportv5/stl/_stream_iterator.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 3 e1b950c65cb4
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
/*
williamr@2
     2
 *
williamr@2
     3
 * Copyright (c) 1994
williamr@2
     4
 * Hewlett-Packard Company
williamr@2
     5
 *
williamr@2
     6
 * Copyright (c) 1996-1998
williamr@2
     7
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     8
 *
williamr@2
     9
 * Copyright (c) 1997
williamr@2
    10
 * Moscow Center for SPARC Technology
williamr@2
    11
 *
williamr@4
    12
 * Copyright (c) 1999
williamr@2
    13
 * Boris Fomitchev
williamr@2
    14
 *
williamr@2
    15
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
    16
 * or implied. Any use is at your own risk.
williamr@2
    17
 *
williamr@4
    18
 * Permission to use or copy this software for any purpose is hereby granted
williamr@2
    19
 * without fee, provided the above notices are retained on all copies.
williamr@2
    20
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    21
 * provided the above notices are retained, and a notice that the code was
williamr@2
    22
 * modified is included with the above copyright notice.
williamr@2
    23
 *
williamr@2
    24
 */
williamr@2
    25
williamr@2
    26
/* NOTE: This is an internal header file, included by other STL headers.
williamr@2
    27
 *   You should not attempt to use it directly.
williamr@2
    28
 */
williamr@2
    29
williamr@4
    30
#if !defined (_STLP_INTERNAL_STREAM_ITERATOR_H) && !defined (_STLP_USE_NO_IOSTREAMS)
williamr@2
    31
#define _STLP_INTERNAL_STREAM_ITERATOR_H
williamr@2
    32
williamr@2
    33
#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
williamr@4
    34
#  include <stl/_iterator_base.h>
williamr@2
    35
#endif
williamr@2
    36
williamr@2
    37
// streambuf_iterators predeclarations must appear first
williamr@2
    38
#ifndef _STLP_IOSFWD
williamr@4
    39
#  include <iosfwd>
williamr@2
    40
#endif
williamr@2
    41
williamr@2
    42
#ifndef _STLP_INTERNAL_ALGOBASE_H
williamr@4
    43
#  include <stl/_algobase.h>
williamr@2
    44
#endif
williamr@2
    45
williamr@2
    46
#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
williamr@4
    47
#  include <stl/_ostreambuf_iterator.h>
williamr@2
    48
#endif
williamr@2
    49
williamr@2
    50
#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
williamr@4
    51
#  include <stl/_istreambuf_iterator.h>
williamr@2
    52
#endif
williamr@2
    53
williamr@4
    54
#ifndef _STLP_INTERNAL_ISTREAM
williamr@4
    55
#  include <stl/_istream.h>
williamr@2
    56
#endif
williamr@2
    57
williamr@2
    58
// istream_iterator and ostream_iterator look very different if we're
williamr@2
    59
// using new, templatized iostreams than if we're using the old cfront
williamr@2
    60
// version.
williamr@2
    61
williamr@2
    62
_STLP_BEGIN_NAMESPACE
williamr@2
    63
williamr@4
    64
#if !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
williamr@4
    65
#  define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _CharT, class _Traits, class _Dist
williamr@4
    66
#  define __ISI_TMPL_ARGUMENTS _Tp, _CharT, _Traits, _Dist
williamr@4
    67
template <class _Tp,
williamr@2
    68
          class _CharT = _STLP_DEFAULTCHAR, class _Traits = char_traits<_CharT>,
williamr@4
    69
          class _Dist = ptrdiff_t>
williamr@2
    70
class istream_iterator : public iterator<input_iterator_tag, _Tp , _Dist,
williamr@4
    71
                                         const _Tp*, const _Tp& > {
williamr@4
    72
#else
williamr@4
    73
#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && !defined (_STLP_DEFAULT_TYPE_PARAM)
williamr@2
    74
#    define __ISI_TMPL_HEADER_ARGUMENTS class _Tp
williamr@2
    75
#    define __ISI_TMPL_ARGUMENTS        _Tp
williamr@2
    76
template <class _Tp>
williamr@4
    77
class istream_iterator : public iterator<input_iterator_tag, _Tp , ptrdiff_t,
williamr@4
    78
                                         const _Tp*, const _Tp& > {
williamr@4
    79
#  else
williamr@2
    80
#    define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _Dist
williamr@2
    81
#    define __ISI_TMPL_ARGUMENTS        _Tp, _Dist
williamr@4
    82
template <class _Tp, _STLP_DFL_TYPE_PARAM(_Dist, ptrdiff_t)>
williamr@4
    83
class istream_iterator : public iterator<input_iterator_tag, _Tp, _Dist ,
williamr@2
    84
                                         const _Tp*, const _Tp& > {
williamr@4
    85
#  endif /* _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS */
williamr@4
    86
#endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
williamr@2
    87
williamr@4
    88
#if defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
williamr@2
    89
  typedef char _CharT;
williamr@2
    90
  typedef char_traits<char> _Traits;
williamr@4
    91
#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && !defined (_STLP_DEFAULT_TYPE_PARAM)
williamr@2
    92
  typedef ptrdiff_t _Dist;
williamr@2
    93
#  endif
williamr@4
    94
#endif
williamr@2
    95
williamr@2
    96
  typedef istream_iterator< __ISI_TMPL_ARGUMENTS > _Self;
williamr@2
    97
public:
williamr@2
    98
  typedef _CharT                         char_type;
williamr@2
    99
  typedef _Traits                        traits_type;
williamr@2
   100
  typedef basic_istream<_CharT, _Traits> istream_type;
williamr@2
   101
williamr@2
   102
  typedef input_iterator_tag             iterator_category;
williamr@2
   103
  typedef _Tp                            value_type;
williamr@2
   104
  typedef _Dist                          difference_type;
williamr@2
   105
  typedef const _Tp*                     pointer;
williamr@2
   106
  typedef const _Tp&                     reference;
williamr@2
   107
williamr@4
   108
  istream_iterator() : _M_stream(0), _M_ok(false), _M_read_done(true) {}
williamr@4
   109
  istream_iterator(istream_type& __s) : _M_stream(&__s), _M_ok(false), _M_read_done(false) {}
williamr@2
   110
williamr@4
   111
  reference operator*() const {
williamr@4
   112
    if (!_M_read_done) {
williamr@4
   113
      _M_read();
williamr@4
   114
    }
williamr@4
   115
    return _M_value;
williamr@4
   116
  }
williamr@2
   117
williamr@2
   118
  _STLP_DEFINE_ARROW_OPERATOR
williamr@2
   119
williamr@4
   120
  _Self& operator++() {
williamr@4
   121
    _M_read();
williamr@2
   122
    return *this;
williamr@2
   123
  }
williamr@2
   124
  _Self operator++(int)  {
williamr@2
   125
    _Self __tmp = *this;
williamr@2
   126
    _M_read();
williamr@2
   127
    return __tmp;
williamr@2
   128
  }
williamr@2
   129
williamr@4
   130
  bool _M_equal(const _Self& __x) const {
williamr@4
   131
    if (!_M_read_done) {
williamr@4
   132
      _M_read();
williamr@4
   133
    }
williamr@4
   134
    if (!__x._M_read_done) {
williamr@4
   135
      __x._M_read();
williamr@4
   136
    }
williamr@4
   137
    return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream);
williamr@4
   138
  }
williamr@2
   139
williamr@2
   140
private:
williamr@2
   141
  istream_type* _M_stream;
williamr@4
   142
  mutable _Tp _M_value;
williamr@4
   143
  mutable bool _M_ok;
williamr@4
   144
  mutable bool _M_read_done;
williamr@2
   145
williamr@4
   146
  void _M_read() const {
williamr@4
   147
    _M_ok = ((_M_stream != 0) && !_M_stream->fail());
williamr@2
   148
    if (_M_ok) {
williamr@2
   149
      *_M_stream >> _M_value;
williamr@4
   150
      _M_ok = !_M_stream->fail();
williamr@2
   151
    }
williamr@4
   152
    _M_read_done = true;
williamr@2
   153
  }
williamr@2
   154
};
williamr@2
   155
williamr@4
   156
#if !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
williamr@2
   157
template <class _TpP,
williamr@2
   158
          class _CharT = _STLP_DEFAULTCHAR, class _Traits = char_traits<_CharT> >
williamr@2
   159
#else
williamr@2
   160
template <class _TpP>
williamr@2
   161
#endif
williamr@2
   162
class ostream_iterator: public iterator<output_iterator_tag, void, void, void, void> {
williamr@4
   163
#if defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
williamr@2
   164
  typedef char _CharT;
williamr@2
   165
  typedef char_traits<char> _Traits;
williamr@2
   166
  typedef ostream_iterator<_TpP> _Self;
williamr@4
   167
#else
williamr@2
   168
  typedef ostream_iterator<_TpP, _CharT, _Traits> _Self;
williamr@4
   169
#endif
williamr@2
   170
public:
williamr@2
   171
  typedef _CharT                         char_type;
williamr@2
   172
  typedef _Traits                        traits_type;
williamr@2
   173
  typedef basic_ostream<_CharT, _Traits> ostream_type;
williamr@2
   174
williamr@2
   175
  typedef output_iterator_tag            iterator_category;
williamr@2
   176
williamr@2
   177
  ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {}
williamr@4
   178
  ostream_iterator(ostream_type& __s, const _CharT* __c)
williamr@2
   179
    : _M_stream(&__s), _M_string(__c)  {}
williamr@4
   180
  _Self& operator=(const _TpP& __val) {
williamr@2
   181
    *_M_stream << __val;
williamr@2
   182
    if (_M_string) *_M_stream << _M_string;
williamr@2
   183
    return *this;
williamr@2
   184
  }
williamr@2
   185
  _Self& operator*() { return *this; }
williamr@4
   186
  _Self& operator++() { return *this; }
williamr@4
   187
  _Self& operator++(int) { return *this; }
williamr@2
   188
private:
williamr@2
   189
  ostream_type* _M_stream;
williamr@2
   190
  const _CharT* _M_string;
williamr@2
   191
};
williamr@2
   192
williamr@4
   193
#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@4
   194
#  if defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
williamr@2
   195
template <class _TpP>
williamr@4
   196
inline output_iterator_tag _STLP_CALL
williamr@2
   197
iterator_category(const ostream_iterator<_TpP>&) { return output_iterator_tag(); }
williamr@4
   198
#  else
williamr@2
   199
template <class _TpP, class _CharT, class _Traits>
williamr@4
   200
inline output_iterator_tag _STLP_CALL
williamr@2
   201
iterator_category(const ostream_iterator<_TpP, _CharT, _Traits>&) { return output_iterator_tag(); }
williamr@2
   202
#  endif
williamr@2
   203
#endif
williamr@2
   204
williamr@2
   205
_STLP_END_NAMESPACE
williamr@2
   206
williamr@2
   207
// form-independent definiotion of stream iterators
williamr@2
   208
_STLP_BEGIN_NAMESPACE
williamr@2
   209
williamr@2
   210
template < __ISI_TMPL_HEADER_ARGUMENTS >
williamr@4
   211
inline bool _STLP_CALL
williamr@2
   212
operator==(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __x,
williamr@4
   213
           const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y)
williamr@4
   214
{ return __x._M_equal(__y); }
williamr@2
   215
williamr@4
   216
#if defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE)
williamr@4
   217
template < __ISI_TMPL_HEADER_ARGUMENTS >
williamr@4
   218
inline bool _STLP_CALL
williamr@4
   219
operator!=(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __x,
williamr@4
   220
           const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y)
williamr@4
   221
{ return !__x._M_equal(__y); }
williamr@4
   222
#endif
williamr@2
   223
williamr@4
   224
#if defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
williamr@2
   225
template < __ISI_TMPL_HEADER_ARGUMENTS >
williamr@4
   226
inline input_iterator_tag _STLP_CALL
williamr@2
   227
iterator_category(const istream_iterator< __ISI_TMPL_ARGUMENTS >&)
williamr@2
   228
{ return input_iterator_tag(); }
williamr@2
   229
template < __ISI_TMPL_HEADER_ARGUMENTS >
williamr@4
   230
inline _Tp* _STLP_CALL
williamr@2
   231
value_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (_Tp*) 0; }
williamr@2
   232
williamr@4
   233
#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && !defined (_STLP_DEFAULT_TYPE_PARAM)
williamr@2
   234
template < __ISI_TMPL_HEADER_ARGUMENTS >
williamr@4
   235
inline ptrdiff_t* _STLP_CALL
williamr@2
   236
distance_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (ptrdiff_t*)0; }
williamr@2
   237
#  else
williamr@2
   238
template < __ISI_TMPL_HEADER_ARGUMENTS >
williamr@4
   239
inline _Dist* _STLP_CALL
williamr@2
   240
distance_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (_Dist*)0; }
williamr@2
   241
#  endif /* _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS */
williamr@4
   242
#endif
williamr@2
   243
williamr@2
   244
_STLP_END_NAMESPACE
williamr@2
   245
williamr@4
   246
#undef __ISI_TMPL_HEADER_ARGUMENTS
williamr@4
   247
#undef __ISI_TMPL_ARGUMENTS
williamr@2
   248
williamr@2
   249
#endif /* _STLP_INTERNAL_STREAM_ITERATOR_H */
williamr@2
   250
williamr@2
   251
// Local Variables:
williamr@2
   252
// mode:C++
williamr@2
   253
// End: