epoc32/include/stdapis/stlportv5/stl/_ostream.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
 * Copyright (c) 1999
williamr@2
     3
 * Silicon Graphics Computer Systems, Inc.
williamr@2
     4
 *
williamr@4
     5
 * Copyright (c) 1999
williamr@2
     6
 * Boris Fomitchev
williamr@2
     7
 *
williamr@2
     8
 * This material is provided "as is", with absolutely no warranty expressed
williamr@2
     9
 * or implied. Any use is at your own risk.
williamr@2
    10
 *
williamr@4
    11
 * Permission to use or copy this software for any purpose is hereby granted
williamr@2
    12
 * without fee, provided the above notices are retained on all copies.
williamr@2
    13
 * Permission to modify the code and to distribute modified code is granted,
williamr@2
    14
 * provided the above notices are retained, and a notice that the code was
williamr@2
    15
 * modified is included with the above copyright notice.
williamr@2
    16
 *
williamr@4
    17
 */
williamr@2
    18
williamr@2
    19
williamr@2
    20
#ifndef _STLP_INTERNAL_OSTREAM_H
williamr@2
    21
#define _STLP_INTERNAL_OSTREAM_H
williamr@2
    22
williamr@2
    23
#ifndef _STLP_INTERNAL_IOS_H
williamr@4
    24
#  include <stl/_ios.h>                  // For basic_ios<>.  Includes <iosfwd>.
williamr@2
    25
#endif
williamr@2
    26
williamr@2
    27
#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
williamr@4
    28
#  include <stl/_ostreambuf_iterator.h>
williamr@4
    29
#endif
williamr@4
    30
williamr@4
    31
#if !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT) && !defined (_STLP_INTERNAL_EXCEPTION)
williamr@4
    32
#  include <stl/_exception.h>
williamr@2
    33
#endif
williamr@2
    34
williamr@2
    35
_STLP_BEGIN_NAMESPACE
williamr@2
    36
williamr@4
    37
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@2
    38
template <class _CharT, class _Traits>
williamr@2
    39
class _Osentry;
williamr@4
    40
#endif
williamr@4
    41
williamr@4
    42
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@2
    43
williamr@2
    44
template <class _CharT, class _Traits>
williamr@4
    45
bool __init_bostr(basic_ostream<_CharT, _Traits>& __str);
williamr@4
    46
williamr@4
    47
_STLP_MOVE_TO_STD_NAMESPACE
williamr@2
    48
williamr@2
    49
//----------------------------------------------------------------------
williamr@2
    50
// class basic_ostream<>
williamr@2
    51
williamr@2
    52
template <class _CharT, class _Traits>
williamr@4
    53
class basic_ostream : virtual public basic_ios<_CharT, _Traits> {
williamr@2
    54
  typedef basic_ostream<_CharT, _Traits> _Self;
williamr@4
    55
williamr@4
    56
#if defined (_STLP_MSVC) && (_STLP_MSVC >= 1300 && _STLP_MSVC <= 1310)
williamr@4
    57
  //explicitely defined as private to avoid warnings:
williamr@4
    58
  basic_ostream(_Self const&);
williamr@4
    59
  _Self& operator = (_Self const&);
williamr@4
    60
#endif
williamr@4
    61
williamr@2
    62
public:                         // Types
williamr@2
    63
  typedef _CharT                     char_type;
williamr@2
    64
  typedef typename _Traits::int_type int_type;
williamr@2
    65
  typedef typename _Traits::pos_type pos_type;
williamr@2
    66
  typedef typename _Traits::off_type off_type;
williamr@2
    67
  typedef _Traits                    traits_type;
williamr@2
    68
  typedef basic_ios<_CharT, _Traits> _Basic_ios;
williamr@2
    69
williamr@2
    70
public:                         // Constructor and destructor.
williamr@4
    71
  explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __buf);
williamr@4
    72
  ~basic_ostream();
williamr@2
    73
williamr@2
    74
public:                         // Hooks for manipulators.
williamr@2
    75
  typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&);
williamr@2
    76
  typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&);
williamr@2
    77
  typedef _Self& (_STLP_CALL *__ostream_fn)(_Self&);
williamr@2
    78
  _Self& operator<< (__ostream_fn __f) { return __f(*this); }
williamr@2
    79
  _Self & operator<< (__ios_base_fn __f) { __f(*this); return *this; }
williamr@2
    80
  _Self& operator<< (__ios_fn __ff) { __ff(*this); return *this; }
williamr@2
    81
williamr@2
    82
private:
williamr@2
    83
  bool _M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from,
williamr@2
    84
                        basic_streambuf<_CharT, _Traits>* __to);
williamr@2
    85
  bool _M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from,
williamr@2
    86
                          basic_streambuf<_CharT, _Traits>* __to);
williamr@2
    87
williamr@2
    88
public:
williamr@2
    89
  void _M_put_char(_CharT __c);
williamr@2
    90
williamr@2
    91
  void _M_put_nowiden(const _CharT* __s);
williamr@2
    92
  void _M_put_widen(const char* __s);
williamr@2
    93
  bool _M_put_widen_aux(const char* __s, streamsize __n);
williamr@2
    94
williamr@2
    95
public:                         // Unformatted output.
williamr@2
    96
  _Self& put(char_type __c);
williamr@2
    97
  _Self& write(const char_type* __s, streamsize __n);
williamr@2
    98
williamr@2
    99
public:                         // Formatted output.
williamr@2
   100
  // Formatted output from a streambuf.
williamr@2
   101
  _Self& operator<<(basic_streambuf<_CharT, _Traits>* __buf);
williamr@2
   102
# ifndef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
williamr@2
   103
  // this is needed for compiling with option char = unsigned
williamr@2
   104
  _Self& operator<<(unsigned char __x) { _M_put_char(__x); return *this; }
williamr@2
   105
# endif
williamr@4
   106
  _Self& operator<<(short __x);
williamr@4
   107
  _Self& operator<<(unsigned short __x);
williamr@4
   108
  _Self& operator<<(int __x);
williamr@4
   109
#if defined (_WIN64) || !defined (_STLP_MSVC) || (_STLP_MSVC < 1300)
williamr@4
   110
  _Self& operator<<(unsigned int __x);
williamr@2
   111
#else
williamr@4
   112
/* We define this operator with size_t rather than unsigned int to avoid
williamr@4
   113
 * 64 bits warning.
williamr@4
   114
 */
williamr@4
   115
  _Self& operator<<(size_t __x);
williamr@2
   116
#endif
williamr@4
   117
  _Self& operator<<(long __x);
williamr@4
   118
  _Self& operator<<(unsigned long __x);
williamr@2
   119
#ifdef _STLP_LONG_LONG
williamr@4
   120
  _Self& operator<< (_STLP_LONG_LONG __x);
williamr@4
   121
  _Self& operator<< (unsigned _STLP_LONG_LONG __x);
williamr@4
   122
#endif
williamr@4
   123
  _Self& operator<<(float __x);
williamr@4
   124
  _Self& operator<<(double __x);
williamr@2
   125
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   126
  _Self& operator<<(long double __x);
williamr@2
   127
# endif
williamr@4
   128
  _Self& operator<<(const void* __x);
williamr@2
   129
# ifndef _STLP_NO_BOOL
williamr@4
   130
  _Self& operator<<(bool __x);
williamr@2
   131
# endif
williamr@2
   132
williamr@2
   133
public:                         // Buffer positioning and manipulation.
williamr@2
   134
  _Self& flush() {
williamr@2
   135
    if (this->rdbuf())
williamr@2
   136
      if (this->rdbuf()->pubsync() == -1)
williamr@2
   137
        this->setstate(ios_base::badbit);
williamr@2
   138
    return *this;
williamr@2
   139
  }
williamr@2
   140
williamr@2
   141
  pos_type tellp() {
williamr@2
   142
    return this->rdbuf() && !this->fail()
williamr@2
   143
      ? this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out)
williamr@2
   144
      : pos_type(-1);
williamr@2
   145
  }
williamr@2
   146
williamr@2
   147
  _Self& seekp(pos_type __pos) {
williamr@4
   148
    if (this->rdbuf() && !this->fail()) {
williamr@4
   149
      if (this->rdbuf()->pubseekpos(__pos) == pos_type(-1)) {
williamr@2
   150
        this->setstate(ios_base::failbit);
williamr@4
   151
      }
williamr@4
   152
    }
williamr@2
   153
    return *this;
williamr@2
   154
  }
williamr@2
   155
williamr@2
   156
  _Self& seekp(off_type __off, ios_base::seekdir __dir) {
williamr@2
   157
    if (this->rdbuf() && !this->fail())
williamr@4
   158
      this->rdbuf()->pubseekoff(__off, __dir);
williamr@2
   159
    return *this;
williamr@2
   160
  }
williamr@2
   161
williamr@2
   162
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@2
   163
  // If we are using DLL specs, we have not to use inner classes
williamr@2
   164
  // end class declaration here
williamr@2
   165
  typedef _Osentry<_CharT, _Traits>  sentry;
williamr@2
   166
};
williamr@2
   167
#  define sentry _Osentry
williamr@2
   168
  template <class _CharT, class _Traits>
williamr@2
   169
  class _Osentry {
williamr@2
   170
    typedef _Osentry<_CharT, _Traits> _Self;
williamr@4
   171
#else
williamr@2
   172
    class sentry {
williamr@2
   173
      typedef sentry _Self;
williamr@4
   174
#endif
williamr@2
   175
    private:
williamr@2
   176
      basic_ostream<_CharT, _Traits>& _M_str;
williamr@2
   177
      //      basic_streambuf<_CharT, _Traits>* _M_buf;
williamr@2
   178
      bool _M_ok;
williamr@2
   179
    public:
williamr@2
   180
      explicit sentry(basic_ostream<_CharT, _Traits>& __str)
williamr@4
   181
        : _M_str(__str), /* _M_buf(__str.rdbuf()), */ _M_ok(_STLP_PRIV __init_bostr(__str))
williamr@4
   182
      {}
williamr@4
   183
williamr@2
   184
      ~sentry() {
williamr@2
   185
        if (_M_str.flags() & ios_base::unitbuf)
williamr@4
   186
#if !defined (_STLP_NO_UNCAUGHT_EXCEPT_SUPPORT)
williamr@4
   187
          if (!uncaught_exception())
williamr@4
   188
#endif
williamr@2
   189
            _M_str.flush();
williamr@2
   190
      }
williamr@2
   191
williamr@2
   192
      operator bool() const { return _M_ok; }
williamr@2
   193
    private:                        // Disable assignment and copy constructor.
williamr@4
   194
      //Implementation is here only to avoid warning with some compilers.
williamr@4
   195
      sentry(const _Self& __s) : _M_str(__s._M_str) {}
williamr@4
   196
      _Self& operator=(const _Self&) { return *this; }
williamr@2
   197
    };
williamr@4
   198
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@2
   199
#  undef sentry
williamr@4
   200
#else
williamr@4
   201
  // close basic_ostream class definition here
williamr@2
   202
};
williamr@4
   203
#endif
williamr@4
   204
williamr@4
   205
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@2
   206
_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<char, char_traits<char> >;
williamr@2
   207
_STLP_EXPORT_TEMPLATE_CLASS _Osentry<char, char_traits<char> >;
williamr@2
   208
#  if !defined (_STLP_NO_WCHAR_T)
williamr@2
   209
_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<wchar_t, char_traits<wchar_t> >;
williamr@2
   210
_STLP_EXPORT_TEMPLATE_CLASS _Osentry<wchar_t, char_traits<wchar_t> >;
williamr@2
   211
#  endif
williamr@4
   212
#endif /* _STLP_USE_TEMPLATE_EXPORT */
williamr@4
   213
williamr@4
   214
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
   215
williamr@4
   216
// Helper functions for istream<>::sentry constructor.
williamr@4
   217
template <class _CharT, class _Traits>
williamr@4
   218
bool __init_bostr(basic_ostream<_CharT, _Traits>& __str) {
williamr@4
   219
  if (__str.good()) {
williamr@4
   220
    // boris : check if this is needed !
williamr@4
   221
    if (!__str.rdbuf())
williamr@4
   222
      __str.setstate(ios_base::badbit);
williamr@4
   223
    if (__str.tie())
williamr@4
   224
      __str.tie()->flush();
williamr@4
   225
    return __str.good();
williamr@4
   226
  }
williamr@4
   227
  else
williamr@4
   228
    return false;
williamr@4
   229
}
williamr@2
   230
williamr@2
   231
template <class _CharT, class _Traits>
williamr@4
   232
inline basic_streambuf<_CharT, _Traits>* _STLP_CALL
williamr@4
   233
__get_ostreambuf(basic_ostream<_CharT, _Traits>& __St)
williamr@4
   234
{ return __St.rdbuf(); }
williamr@4
   235
williamr@4
   236
_STLP_MOVE_TO_STD_NAMESPACE
williamr@2
   237
williamr@2
   238
// Non-member functions.
williamr@2
   239
template <class _CharT, class _Traits>
williamr@2
   240
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   241
operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c){
williamr@2
   242
  __os._M_put_char(__c);
williamr@2
   243
  return __os;
williamr@2
   244
}
williamr@2
   245
williamr@2
   246
template <class _CharT, class _Traits>
williamr@2
   247
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
   248
operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __s) {
williamr@2
   249
  __os._M_put_nowiden(__s);
williamr@2
   250
  return __os;
williamr@2
   251
}
williamr@2
   252
williamr@4
   253
#if defined (_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@2
   254
// some specializations
williamr@2
   255
williamr@2
   256
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@2
   257
operator<<(basic_ostream<char, char_traits<char> >& __os, char __c) {
williamr@2
   258
  __os._M_put_char(__c);
williamr@2
   259
  return __os;
williamr@2
   260
}
williamr@2
   261
williamr@2
   262
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@2
   263
operator<<(basic_ostream<char, char_traits<char> >& __os, signed char __c) {
williamr@2
   264
  __os._M_put_char(__c);
williamr@2
   265
  return __os;
williamr@2
   266
}
williamr@2
   267
williamr@2
   268
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@2
   269
operator<<(basic_ostream<char, char_traits<char> >& __os, unsigned char __c) {
williamr@2
   270
  __os._M_put_char(__c);
williamr@2
   271
  return __os;
williamr@2
   272
}
williamr@2
   273
williamr@2
   274
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@2
   275
operator<<(basic_ostream<char, char_traits<char> >& __os, const char* __s) {
williamr@2
   276
  __os._M_put_nowiden(__s);
williamr@2
   277
  return __os;
williamr@2
   278
}
williamr@2
   279
williamr@2
   280
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@2
   281
operator<<(basic_ostream<char, char_traits<char> >& __os, const signed char* __s) {
williamr@4
   282
  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
williamr@2
   283
  return __os;
williamr@2
   284
}
williamr@2
   285
williamr@2
   286
inline basic_ostream<char, char_traits<char> >&
williamr@2
   287
operator<<(basic_ostream<char, char_traits<char> >& __os, const unsigned char* __s) {
williamr@2
   288
  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
williamr@2
   289
  return __os;
williamr@2
   290
}
williamr@2
   291
williamr@4
   292
#else
williamr@2
   293
williamr@2
   294
// also for compilers who might use that
williamr@2
   295
template <class _CharT, class _Traits>
williamr@2
   296
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
   297
operator<<(basic_ostream<_CharT, _Traits>& __os, char __c) {
williamr@2
   298
  __os._M_put_char(__os.widen(__c));
williamr@2
   299
  return __os;
williamr@2
   300
}
williamr@2
   301
williamr@2
   302
template <class _Traits>
williamr@2
   303
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@2
   304
operator<<(basic_ostream<char, _Traits>& __os, char __c) {
williamr@2
   305
  __os._M_put_char(__c);
williamr@2
   306
  return __os;
williamr@2
   307
}
williamr@2
   308
williamr@2
   309
template <class _Traits>
williamr@2
   310
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@2
   311
operator<<(basic_ostream<char, _Traits>& __os, signed char __c) {
williamr@2
   312
  __os._M_put_char(__c);
williamr@2
   313
  return __os;
williamr@2
   314
}
williamr@2
   315
williamr@2
   316
template <class _Traits>
williamr@2
   317
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@2
   318
operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) {
williamr@2
   319
  __os._M_put_char(__c);
williamr@2
   320
  return __os;
williamr@2
   321
}
williamr@2
   322
williamr@2
   323
template <class _CharT, class _Traits>
williamr@2
   324
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
   325
operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __s) {
williamr@2
   326
  __os._M_put_widen(__s);
williamr@2
   327
  return __os;
williamr@2
   328
}
williamr@2
   329
williamr@2
   330
template <class _Traits>
williamr@2
   331
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@2
   332
operator<<(basic_ostream<char, _Traits>& __os, const char* __s) {
williamr@2
   333
  __os._M_put_nowiden(__s);
williamr@2
   334
  return __os;
williamr@2
   335
}
williamr@2
   336
williamr@2
   337
template <class _Traits>
williamr@2
   338
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@2
   339
operator<<(basic_ostream<char, _Traits>& __os, const signed char* __s) {
williamr@2
   340
  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
williamr@2
   341
  return __os;
williamr@2
   342
}
williamr@2
   343
williamr@2
   344
template <class _Traits>
williamr@2
   345
inline basic_ostream<char, _Traits>&
williamr@2
   346
operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __s) {
williamr@2
   347
  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
williamr@2
   348
  return __os;
williamr@2
   349
}
williamr@4
   350
#endif /* _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER */
williamr@2
   351
williamr@2
   352
//----------------------------------------------------------------------
williamr@2
   353
// basic_ostream manipulators.
williamr@2
   354
williamr@2
   355
template <class _CharT, class _Traits>
williamr@2
   356
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
   357
endl(basic_ostream<_CharT, _Traits>& __os) {
williamr@2
   358
  __os.put(__os.widen('\n'));
williamr@2
   359
  __os.flush();
williamr@2
   360
  return __os;
williamr@2
   361
}
williamr@2
   362
williamr@2
   363
template <class _CharT, class _Traits>
williamr@2
   364
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
   365
ends(basic_ostream<_CharT, _Traits>& __os) {
williamr@2
   366
  __os.put(_STLP_DEFAULT_CONSTRUCTED(_CharT));
williamr@2
   367
  return __os;
williamr@2
   368
}
williamr@2
   369
williamr@2
   370
template <class _CharT, class _Traits>
williamr@2
   371
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@2
   372
flush(basic_ostream<_CharT, _Traits>& __os) {
williamr@2
   373
  __os.flush();
williamr@2
   374
  return __os;
williamr@2
   375
}
williamr@2
   376
williamr@2
   377
_STLP_END_NAMESPACE
williamr@2
   378
williamr@2
   379
#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@2
   380
#  include <stl/_ostream.c>
williamr@4
   381
#endif
williamr@2
   382
williamr@2
   383
#endif /* _STLP_INTERNAL_OSTREAM_H */
williamr@2
   384
williamr@2
   385
// Local Variables:
williamr@2
   386
// mode:C++
williamr@2
   387
// End: