1/*
2 * Copyright (c) 1999
3 * Silicon Graphics Computer Systems, Inc.
4 *
5 * Copyright (c) 1999
6 * Boris Fomitchev
7 *
8 * This material is provided "as is", with absolutely no warranty expressed
9 * or implied. Any use is at your own risk.
10 *
11 * Permission to use or copy this software for any purpose is hereby granted
12 * without fee, provided the above notices are retained on all copies.
13 * Permission to modify the code and to distribute modified code is granted,
14 * provided the above notices are retained, and a notice that the code was
15 * modified is included with the above copyright notice.
16 *
17 */
18#ifndef _STLP_INTERNAL_IOS_H
19#define _STLP_INTERNAL_IOS_H
20
21
22#ifndef _STLP_IOS_BASE_H
23# include <stl/_ios_base.h>
24#endif
25
26#ifndef _STLP_INTERNAL_CTYPE_H
27# include <stl/_ctype.h>
28#endif
29
30#ifndef _STLP_INTERNAL_NUMPUNCT_H
31# include <stl/_numpunct.h>
32#endif
33
34_STLP_BEGIN_NAMESPACE
35
36// ----------------------------------------------------------------------
37
38// Class basic_ios, a subclass of ios_base.  The only important difference
39// between the two is that basic_ios is a class template, parameterized
40// by the character type.  ios_base exists to factor out all of the
41// common properties that don't depend on the character type.
42
43// The second template parameter, _Traits, defaults to char_traits<_CharT>.
44// The default is declared in header <iosfwd>, and it isn't declared here
45// because C++ language rules do not allow it to be declared twice.
46
47template <class _CharT, class _Traits>
48class basic_ios : public ios_base {
49  friend class ios_base;
50public:                         // Synonyms for types.
51  typedef _CharT                     char_type;
52  typedef typename _Traits::int_type int_type;
53  typedef typename _Traits::pos_type pos_type;
54  typedef typename _Traits::off_type off_type;
55  typedef _Traits                    traits_type;
56
57public:                         // Constructor, destructor.
58  explicit basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf);
59  virtual ~basic_ios() {}
60
61public:                         // Members from clause 27.4.4.2
62  basic_ostream<_CharT, _Traits>* tie() const {
63    return _M_tied_ostream;
64  }
65  basic_ostream<_CharT, _Traits>*
66  tie(basic_ostream<char_type, traits_type>* __new_tied_ostream) {
67    basic_ostream<char_type, traits_type>* __tmp = _M_tied_ostream;
68    _M_tied_ostream = __new_tied_ostream;
69    return __tmp;
70  }
71
72  basic_streambuf<_CharT, _Traits>* rdbuf() const
73    { return _M_streambuf; }
74
75  basic_streambuf<_CharT, _Traits>*
76  rdbuf(basic_streambuf<char_type, traits_type>*);
77
78  // Copies __x's state to *this.
79  basic_ios<_CharT, _Traits>& copyfmt(const basic_ios<_CharT, _Traits>& __x);
80
81  char_type fill() const { return _M_fill; }
82  char_type fill(char_type __fill) {
83    char_type __tmp(_M_fill);
84    _M_fill = __fill;
85    return __tmp;
86  }
87
88public:                         // Members from 27.4.4.3.  These four functions
89                                // can almost be defined in ios_base.
90
91  void clear(iostate __state = goodbit) {
92    _M_clear_nothrow(this->rdbuf() ? __state : iostate(__state|ios_base::badbit));
93    _M_check_exception_mask();
94  }
95  void setstate(iostate __state) { this->clear(rdstate() | __state); }
96
97  iostate exceptions() const { return this->_M_get_exception_mask(); }
98  void exceptions(iostate __mask) {
99    this->_M_set_exception_mask(__mask);
100    this->clear(this->rdstate());
101  }
102
103public:                         // Locale-related member functions.
104  locale imbue(const locale&);
105
106  inline char narrow(_CharT, char) const ;
107  inline _CharT widen(char) const;
108
109  // Helper function that makes testing for EOF more convenient.
110  static bool _STLP_CALL _S_eof(int_type __c) {
111    const int_type __eof = _Traits::eof();
112    return _Traits::eq_int_type(__c, __eof);
113  }
114
115protected:
116  // Cached copy of the curent locale's ctype facet.  Set by init() and imbue().
117  const ctype<char_type>* _M_cached_ctype;
118
119public:
120  // Equivalent to &use_facet< Facet >(getloc()), but faster.
121  const ctype<char_type>* _M_ctype_facet() const { return _M_cached_ctype; }
122
123protected:
124  basic_ios();
125
126  void init(basic_streambuf<_CharT, _Traits>* __streambuf);
127
128public:
129
130  // Helper function used in istream and ostream.  It is called only from
131  // a catch clause.
132  void _M_handle_exception(ios_base::iostate __flag);
133
134private:                        // Data members
135  char_type _M_fill;            // The fill character, used for padding.
136
137  basic_streambuf<_CharT, _Traits>* _M_streambuf;
138  basic_ostream<_CharT, _Traits>*   _M_tied_ostream;
139
140};
141
142
143template <class _CharT, class _Traits>
144inline char
145basic_ios<_CharT, _Traits>::narrow(_CharT __c, char __default) const
146{ return _M_ctype_facet()->narrow(__c, __default); }
147
148template <class _CharT, class _Traits>
149inline _CharT
150basic_ios<_CharT, _Traits>::widen(char __c) const
151{ return _M_ctype_facet()->widen(__c); }
152
153# if !defined (_STLP_NO_METHOD_SPECIALIZATION)
154_STLP_TEMPLATE_NULL
155inline char
156basic_ios<char, char_traits<char> >::narrow(char __c, char) const
157{
158  return __c;
159}
160
161_STLP_TEMPLATE_NULL
162inline char
163basic_ios<char, char_traits<char> >::widen(char __c) const
164{
165  return __c;
166}
167# endif /* _STLP_NO_METHOD_SPECIALIZATION */
168
169# if defined (_STLP_USE_TEMPLATE_EXPORT)
170_STLP_EXPORT_TEMPLATE_CLASS basic_ios<char, char_traits<char> >;
171#  if ! defined (_STLP_NO_WCHAR_T)
172_STLP_EXPORT_TEMPLATE_CLASS basic_ios<wchar_t, char_traits<wchar_t> >;
173#  endif
174# endif /* _STLP_USE_TEMPLATE_EXPORT */
175
176_STLP_END_NAMESPACE
177
178#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
179#  include <stl/_ios.c>
180#endif
181
182#endif /* _STLP_IOS */
183
184// Local Variables:
185// mode:C++
186// End:
187
188