epoc32/include/tools/stlport/stl/_ostream.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100 (2010-03-31)
branchSymbian3
changeset 4 837f303aceeb
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@4
     1
/*
williamr@4
     2
 * Copyright (c) 1999
williamr@4
     3
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     4
 *
williamr@4
     5
 * Copyright (c) 1999
williamr@4
     6
 * Boris Fomitchev
williamr@4
     7
 *
williamr@4
     8
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
     9
 * or implied. Any use is at your own risk.
williamr@4
    10
 *
williamr@4
    11
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    12
 * without fee, provided the above notices are retained on all copies.
williamr@4
    13
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    14
 * provided the above notices are retained, and a notice that the code was
williamr@4
    15
 * modified is included with the above copyright notice.
williamr@4
    16
 *
williamr@4
    17
 */
williamr@4
    18
williamr@4
    19
williamr@4
    20
#ifndef _STLP_INTERNAL_OSTREAM_H
williamr@4
    21
#define _STLP_INTERNAL_OSTREAM_H
williamr@4
    22
williamr@4
    23
#ifndef _STLP_INTERNAL_IOS_H
williamr@4
    24
#  include <stl/_ios.h>                  // For basic_ios<>.  Includes <iosfwd>.
williamr@4
    25
#endif
williamr@4
    26
williamr@4
    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@4
    33
#endif
williamr@4
    34
williamr@4
    35
_STLP_BEGIN_NAMESPACE
williamr@4
    36
williamr@4
    37
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@4
    38
template <class _CharT, class _Traits>
williamr@4
    39
class _Osentry;
williamr@4
    40
#endif
williamr@4
    41
williamr@4
    42
_STLP_MOVE_TO_PRIV_NAMESPACE
williamr@4
    43
williamr@4
    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@4
    48
williamr@4
    49
//----------------------------------------------------------------------
williamr@4
    50
// class basic_ostream<>
williamr@4
    51
williamr@4
    52
template <class _CharT, class _Traits>
williamr@4
    53
class basic_ostream : virtual public basic_ios<_CharT, _Traits> {
williamr@4
    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@4
    62
public:                         // Types
williamr@4
    63
  typedef _CharT                     char_type;
williamr@4
    64
  typedef typename _Traits::int_type int_type;
williamr@4
    65
  typedef typename _Traits::pos_type pos_type;
williamr@4
    66
  typedef typename _Traits::off_type off_type;
williamr@4
    67
  typedef _Traits                    traits_type;
williamr@4
    68
  typedef basic_ios<_CharT, _Traits> _Basic_ios;
williamr@4
    69
williamr@4
    70
public:                         // Constructor and destructor.
williamr@4
    71
  explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __buf);
williamr@4
    72
  ~basic_ostream();
williamr@4
    73
williamr@4
    74
public:                         // Hooks for manipulators.
williamr@4
    75
  typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&);
williamr@4
    76
  typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&);
williamr@4
    77
  typedef _Self& (_STLP_CALL *__ostream_fn)(_Self&);
williamr@4
    78
  _Self& operator<< (__ostream_fn __f) { return __f(*this); }
williamr@4
    79
  _Self & operator<< (__ios_base_fn __f) { __f(*this); return *this; }
williamr@4
    80
  _Self& operator<< (__ios_fn __ff) { __ff(*this); return *this; }
williamr@4
    81
williamr@4
    82
private:
williamr@4
    83
  bool _M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from,
williamr@4
    84
                        basic_streambuf<_CharT, _Traits>* __to);
williamr@4
    85
  bool _M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from,
williamr@4
    86
                          basic_streambuf<_CharT, _Traits>* __to);
williamr@4
    87
williamr@4
    88
public:
williamr@4
    89
  void _M_put_char(_CharT __c);
williamr@4
    90
williamr@4
    91
  void _M_put_nowiden(const _CharT* __s);
williamr@4
    92
  void _M_put_widen(const char* __s);
williamr@4
    93
  bool _M_put_widen_aux(const char* __s, streamsize __n);
williamr@4
    94
williamr@4
    95
public:                         // Unformatted output.
williamr@4
    96
  _Self& put(char_type __c);
williamr@4
    97
  _Self& write(const char_type* __s, streamsize __n);
williamr@4
    98
williamr@4
    99
public:                         // Formatted output.
williamr@4
   100
  // Formatted output from a streambuf.
williamr@4
   101
  _Self& operator<<(basic_streambuf<_CharT, _Traits>* __buf);
williamr@4
   102
# ifndef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
williamr@4
   103
  // this is needed for compiling with option char = unsigned
williamr@4
   104
  _Self& operator<<(unsigned char __x) { _M_put_char(__x); return *this; }
williamr@4
   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@4
   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@4
   116
#endif
williamr@4
   117
  _Self& operator<<(long __x);
williamr@4
   118
  _Self& operator<<(unsigned long __x);
williamr@4
   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@4
   125
# ifndef _STLP_NO_LONG_DOUBLE
williamr@4
   126
  _Self& operator<<(long double __x);
williamr@4
   127
# endif
williamr@4
   128
  _Self& operator<<(const void* __x);
williamr@4
   129
# ifndef _STLP_NO_BOOL
williamr@4
   130
  _Self& operator<<(bool __x);
williamr@4
   131
# endif
williamr@4
   132
williamr@4
   133
public:                         // Buffer positioning and manipulation.
williamr@4
   134
  _Self& flush() {
williamr@4
   135
    if (this->rdbuf())
williamr@4
   136
      if (this->rdbuf()->pubsync() == -1)
williamr@4
   137
        this->setstate(ios_base::badbit);
williamr@4
   138
    return *this;
williamr@4
   139
  }
williamr@4
   140
williamr@4
   141
  pos_type tellp() {
williamr@4
   142
    return this->rdbuf() && !this->fail()
williamr@4
   143
      ? this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out)
williamr@4
   144
      : pos_type(-1);
williamr@4
   145
  }
williamr@4
   146
williamr@4
   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@4
   150
        this->setstate(ios_base::failbit);
williamr@4
   151
      }
williamr@4
   152
    }
williamr@4
   153
    return *this;
williamr@4
   154
  }
williamr@4
   155
williamr@4
   156
  _Self& seekp(off_type __off, ios_base::seekdir __dir) {
williamr@4
   157
    if (this->rdbuf() && !this->fail())
williamr@4
   158
      this->rdbuf()->pubseekoff(__off, __dir);
williamr@4
   159
    return *this;
williamr@4
   160
  }
williamr@4
   161
williamr@4
   162
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@4
   163
  // If we are using DLL specs, we have not to use inner classes
williamr@4
   164
  // end class declaration here
williamr@4
   165
  typedef _Osentry<_CharT, _Traits>  sentry;
williamr@4
   166
};
williamr@4
   167
#  define sentry _Osentry
williamr@4
   168
  template <class _CharT, class _Traits>
williamr@4
   169
  class _Osentry {
williamr@4
   170
    typedef _Osentry<_CharT, _Traits> _Self;
williamr@4
   171
#else
williamr@4
   172
    class sentry {
williamr@4
   173
      typedef sentry _Self;
williamr@4
   174
#endif
williamr@4
   175
    private:
williamr@4
   176
      basic_ostream<_CharT, _Traits>& _M_str;
williamr@4
   177
      //      basic_streambuf<_CharT, _Traits>* _M_buf;
williamr@4
   178
      bool _M_ok;
williamr@4
   179
    public:
williamr@4
   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@4
   184
      ~sentry() {
williamr@4
   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@4
   189
            _M_str.flush();
williamr@4
   190
      }
williamr@4
   191
williamr@4
   192
      operator bool() const { return _M_ok; }
williamr@4
   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@4
   197
    };
williamr@4
   198
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@4
   199
#  undef sentry
williamr@4
   200
#else
williamr@4
   201
  // close basic_ostream class definition here
williamr@4
   202
};
williamr@4
   203
#endif
williamr@4
   204
williamr@4
   205
#if defined (_STLP_USE_TEMPLATE_EXPORT)
williamr@4
   206
_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<char, char_traits<char> >;
williamr@4
   207
_STLP_EXPORT_TEMPLATE_CLASS _Osentry<char, char_traits<char> >;
williamr@4
   208
#  if !defined (_STLP_NO_WCHAR_T)
williamr@4
   209
_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<wchar_t, char_traits<wchar_t> >;
williamr@4
   210
_STLP_EXPORT_TEMPLATE_CLASS _Osentry<wchar_t, char_traits<wchar_t> >;
williamr@4
   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@4
   230
williamr@4
   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@4
   237
williamr@4
   238
// Non-member functions.
williamr@4
   239
template <class _CharT, class _Traits>
williamr@4
   240
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   241
operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c){
williamr@4
   242
  __os._M_put_char(__c);
williamr@4
   243
  return __os;
williamr@4
   244
}
williamr@4
   245
williamr@4
   246
template <class _CharT, class _Traits>
williamr@4
   247
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   248
operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __s) {
williamr@4
   249
  __os._M_put_nowiden(__s);
williamr@4
   250
  return __os;
williamr@4
   251
}
williamr@4
   252
williamr@4
   253
#if defined (_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER)
williamr@4
   254
// some specializations
williamr@4
   255
williamr@4
   256
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@4
   257
operator<<(basic_ostream<char, char_traits<char> >& __os, char __c) {
williamr@4
   258
  __os._M_put_char(__c);
williamr@4
   259
  return __os;
williamr@4
   260
}
williamr@4
   261
williamr@4
   262
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@4
   263
operator<<(basic_ostream<char, char_traits<char> >& __os, signed char __c) {
williamr@4
   264
  __os._M_put_char(__c);
williamr@4
   265
  return __os;
williamr@4
   266
}
williamr@4
   267
williamr@4
   268
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@4
   269
operator<<(basic_ostream<char, char_traits<char> >& __os, unsigned char __c) {
williamr@4
   270
  __os._M_put_char(__c);
williamr@4
   271
  return __os;
williamr@4
   272
}
williamr@4
   273
williamr@4
   274
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@4
   275
operator<<(basic_ostream<char, char_traits<char> >& __os, const char* __s) {
williamr@4
   276
  __os._M_put_nowiden(__s);
williamr@4
   277
  return __os;
williamr@4
   278
}
williamr@4
   279
williamr@4
   280
inline basic_ostream<char, char_traits<char> >& _STLP_CALL
williamr@4
   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@4
   283
  return __os;
williamr@4
   284
}
williamr@4
   285
williamr@4
   286
inline basic_ostream<char, char_traits<char> >&
williamr@4
   287
operator<<(basic_ostream<char, char_traits<char> >& __os, const unsigned char* __s) {
williamr@4
   288
  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
williamr@4
   289
  return __os;
williamr@4
   290
}
williamr@4
   291
williamr@4
   292
#else
williamr@4
   293
williamr@4
   294
// also for compilers who might use that
williamr@4
   295
template <class _CharT, class _Traits>
williamr@4
   296
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   297
operator<<(basic_ostream<_CharT, _Traits>& __os, char __c) {
williamr@4
   298
  __os._M_put_char(__os.widen(__c));
williamr@4
   299
  return __os;
williamr@4
   300
}
williamr@4
   301
williamr@4
   302
template <class _Traits>
williamr@4
   303
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@4
   304
operator<<(basic_ostream<char, _Traits>& __os, char __c) {
williamr@4
   305
  __os._M_put_char(__c);
williamr@4
   306
  return __os;
williamr@4
   307
}
williamr@4
   308
williamr@4
   309
template <class _Traits>
williamr@4
   310
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@4
   311
operator<<(basic_ostream<char, _Traits>& __os, signed char __c) {
williamr@4
   312
  __os._M_put_char(__c);
williamr@4
   313
  return __os;
williamr@4
   314
}
williamr@4
   315
williamr@4
   316
template <class _Traits>
williamr@4
   317
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@4
   318
operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) {
williamr@4
   319
  __os._M_put_char(__c);
williamr@4
   320
  return __os;
williamr@4
   321
}
williamr@4
   322
williamr@4
   323
template <class _CharT, class _Traits>
williamr@4
   324
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   325
operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __s) {
williamr@4
   326
  __os._M_put_widen(__s);
williamr@4
   327
  return __os;
williamr@4
   328
}
williamr@4
   329
williamr@4
   330
template <class _Traits>
williamr@4
   331
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@4
   332
operator<<(basic_ostream<char, _Traits>& __os, const char* __s) {
williamr@4
   333
  __os._M_put_nowiden(__s);
williamr@4
   334
  return __os;
williamr@4
   335
}
williamr@4
   336
williamr@4
   337
template <class _Traits>
williamr@4
   338
inline basic_ostream<char, _Traits>& _STLP_CALL
williamr@4
   339
operator<<(basic_ostream<char, _Traits>& __os, const signed char* __s) {
williamr@4
   340
  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
williamr@4
   341
  return __os;
williamr@4
   342
}
williamr@4
   343
williamr@4
   344
template <class _Traits>
williamr@4
   345
inline basic_ostream<char, _Traits>&
williamr@4
   346
operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __s) {
williamr@4
   347
  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
williamr@4
   348
  return __os;
williamr@4
   349
}
williamr@4
   350
#endif /* _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER */
williamr@4
   351
williamr@4
   352
//----------------------------------------------------------------------
williamr@4
   353
// basic_ostream manipulators.
williamr@4
   354
williamr@4
   355
template <class _CharT, class _Traits>
williamr@4
   356
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   357
endl(basic_ostream<_CharT, _Traits>& __os) {
williamr@4
   358
  __os.put(__os.widen('\n'));
williamr@4
   359
  __os.flush();
williamr@4
   360
  return __os;
williamr@4
   361
}
williamr@4
   362
williamr@4
   363
template <class _CharT, class _Traits>
williamr@4
   364
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   365
ends(basic_ostream<_CharT, _Traits>& __os) {
williamr@4
   366
  __os.put(_STLP_DEFAULT_CONSTRUCTED(_CharT));
williamr@4
   367
  return __os;
williamr@4
   368
}
williamr@4
   369
williamr@4
   370
template <class _CharT, class _Traits>
williamr@4
   371
inline basic_ostream<_CharT, _Traits>& _STLP_CALL
williamr@4
   372
flush(basic_ostream<_CharT, _Traits>& __os) {
williamr@4
   373
  __os.flush();
williamr@4
   374
  return __os;
williamr@4
   375
}
williamr@4
   376
williamr@4
   377
_STLP_END_NAMESPACE
williamr@4
   378
williamr@4
   379
#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@4
   380
#  include <stl/_ostream.c>
williamr@4
   381
#endif
williamr@4
   382
williamr@4
   383
#endif /* _STLP_INTERNAL_OSTREAM_H */
williamr@4
   384
williamr@4
   385
// Local Variables:
williamr@4
   386
// mode:C++
williamr@4
   387
// End: