OSDN Git Service

libstdc++/5432
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / bits / ios_base.h
1 // Iostreams base classes -*- C++ -*-
2
3 // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
4 // Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library.  This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 2, or (at your option)
10 // any later version.
11
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING.  If not, write to the Free
19 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20 // USA.
21
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction.  Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License.  This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
30
31 //
32 // ISO C++ 14882: 27.8  File-based streams
33 //
34
35 /** @file ios_base.h
36  *  This is an internal header file, included by other library headers.
37  *  You should not attempt to use it directly.
38  */
39
40 #ifndef _CPP_BITS_IOSBASE_H
41 #define _CPP_BITS_IOSBASE_H 1
42
43 #pragma GCC system_header
44
45 #include <bits/atomicity.h>
46
47 namespace std
48 {
49   // The following definitions of bitmask types are enums, not ints,
50   // as permitted (but not required) in the standard, in order to provide
51   // better type safety in iostream calls.  A side effect is that
52   // expressions involving them are no longer compile-time constants.
53   enum _Ios_Fmtflags { _M_ios_fmtflags_end = 1L << 16 };
54
55   inline _Ios_Fmtflags 
56   operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
57   { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); }
58
59   inline _Ios_Fmtflags 
60   operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
61   { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); }
62
63   inline _Ios_Fmtflags 
64   operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b)
65   { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); }
66
67   inline _Ios_Fmtflags 
68   operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
69   { return __a = __a | __b; }
70
71   inline _Ios_Fmtflags 
72   operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
73   { return __a = __a & __b; }
74
75   inline _Ios_Fmtflags 
76   operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b)
77   { return __a = __a ^ __b; }
78
79   inline _Ios_Fmtflags 
80   operator~(_Ios_Fmtflags __a)
81   { return _Ios_Fmtflags(~static_cast<int>(__a)); }
82
83
84   enum _Ios_Openmode { _M_ios_openmode_end = 1L << 16 };
85
86   inline _Ios_Openmode 
87   operator&(_Ios_Openmode __a, _Ios_Openmode __b)
88   { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); }
89
90   inline _Ios_Openmode 
91   operator|(_Ios_Openmode __a, _Ios_Openmode __b)
92   { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); }
93
94   inline _Ios_Openmode 
95   operator^(_Ios_Openmode __a, _Ios_Openmode __b)
96   { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); }
97
98   inline _Ios_Openmode 
99   operator|=(_Ios_Openmode& __a, _Ios_Openmode __b)
100   { return __a = __a | __b; }
101
102   inline _Ios_Openmode 
103   operator&=(_Ios_Openmode& __a, _Ios_Openmode __b)
104   { return __a = __a & __b; }
105
106   inline _Ios_Openmode 
107   operator^=(_Ios_Openmode& __a, _Ios_Openmode __b)
108   { return __a = __a ^ __b; }
109
110   inline _Ios_Openmode 
111   operator~(_Ios_Openmode __a)
112   { return _Ios_Openmode(~static_cast<int>(__a)); }
113
114
115   enum _Ios_Iostate { _M_ios_iostate_end = 1L << 16 };
116
117   inline _Ios_Iostate 
118   operator&(_Ios_Iostate __a, _Ios_Iostate __b)
119   { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); }
120
121   inline _Ios_Iostate 
122   operator|(_Ios_Iostate __a, _Ios_Iostate __b)
123   { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); }
124
125   inline _Ios_Iostate 
126   operator^(_Ios_Iostate __a, _Ios_Iostate __b)
127   { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); }
128
129   inline _Ios_Iostate 
130   operator|=(_Ios_Iostate& __a, _Ios_Iostate __b)
131   { return __a = __a | __b; }
132
133   inline _Ios_Iostate 
134   operator&=(_Ios_Iostate& __a, _Ios_Iostate __b)
135   { return __a = __a & __b; }
136
137   inline _Ios_Iostate 
138   operator^=(_Ios_Iostate& __a, _Ios_Iostate __b)
139   { return __a = __a ^ __b; }
140
141   inline _Ios_Iostate 
142   operator~(_Ios_Iostate __a)
143   { return _Ios_Iostate(~static_cast<int>(__a)); }
144
145   enum _Ios_Seekdir { _M_ios_seekdir_end = 1L << 16 };
146
147   // 27.4.2  Class ios_base
148   class ios_base
149   {
150   public:
151     
152     // 27.4.2.1.1  Class ios_base::failure
153     class failure : public exception
154     {
155     public:
156 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
157       //48.  Use of non-existent exception constructor
158       explicit 
159       failure(const string& __str) throw();
160
161       virtual 
162       ~failure() throw();
163
164       virtual const char*
165       what() const throw();
166       
167     private:
168       enum { _M_bufsize = 256 };
169       char _M_name[_M_bufsize];
170 #endif
171     };
172
173     // 27.4.2.1.2  Type ios_base::fmtflags
174     typedef _Ios_Fmtflags fmtflags;
175     // 27.4.2.1.2  Type fmtflags
176     static const fmtflags boolalpha =   fmtflags(__ios_flags::_S_boolalpha);
177     static const fmtflags dec =         fmtflags(__ios_flags::_S_dec);
178     static const fmtflags fixed =       fmtflags(__ios_flags::_S_fixed);
179     static const fmtflags hex =         fmtflags(__ios_flags::_S_hex);
180     static const fmtflags internal =    fmtflags(__ios_flags::_S_internal);
181     static const fmtflags left =        fmtflags(__ios_flags::_S_left);
182     static const fmtflags oct =         fmtflags(__ios_flags::_S_oct);
183     static const fmtflags right =       fmtflags(__ios_flags::_S_right);
184     static const fmtflags scientific =  fmtflags(__ios_flags::_S_scientific);
185     static const fmtflags showbase =    fmtflags(__ios_flags::_S_showbase);
186     static const fmtflags showpoint =   fmtflags(__ios_flags::_S_showpoint);
187     static const fmtflags showpos =     fmtflags(__ios_flags::_S_showpos);
188     static const fmtflags skipws =      fmtflags(__ios_flags::_S_skipws);
189     static const fmtflags unitbuf =     fmtflags(__ios_flags::_S_unitbuf);
190     static const fmtflags uppercase =   fmtflags(__ios_flags::_S_uppercase);
191     static const fmtflags adjustfield = fmtflags(__ios_flags::_S_adjustfield);
192     static const fmtflags basefield =   fmtflags(__ios_flags::_S_basefield);
193     static const fmtflags floatfield =  fmtflags(__ios_flags::_S_floatfield);
194
195     // 27.4.2.1.3  Type ios_base::iostate
196     typedef _Ios_Iostate iostate;
197     static const iostate badbit =       iostate(__ios_flags::_S_badbit);
198     static const iostate eofbit =       iostate(__ios_flags::_S_eofbit);
199     static const iostate failbit =      iostate(__ios_flags::_S_failbit);
200     static const iostate goodbit =      iostate(0);
201
202     // 27.4.2.1.4  Type openmode
203     typedef _Ios_Openmode openmode;
204     static const openmode app =         openmode(__ios_flags::_S_app);
205     static const openmode ate =         openmode(__ios_flags::_S_ate);
206     static const openmode binary =      openmode(__ios_flags::_S_bin);
207     static const openmode in =          openmode(__ios_flags::_S_in);
208     static const openmode out =         openmode(__ios_flags::_S_out);
209     static const openmode trunc =       openmode(__ios_flags::_S_trunc);
210
211     // 27.4.2.1.5  Type seekdir
212     typedef _Ios_Seekdir seekdir;
213     static const seekdir beg =          seekdir(0);
214     static const seekdir cur =          seekdir(SEEK_CUR);
215     static const seekdir end =          seekdir(SEEK_END);
216
217 #ifdef _GLIBCPP_DEPRECATED
218     typedef int io_state;
219     typedef int open_mode;
220     typedef int seek_dir;
221 #endif
222
223     // Callbacks;
224     enum event
225     {
226       erase_event,
227       imbue_event,
228       copyfmt_event
229     };
230
231     typedef void (*event_callback) (event, ios_base&, int);
232
233     void 
234     register_callback(event_callback __fn, int __index);
235
236   protected:
237     // Data Members
238     streamsize          _M_precision;
239     streamsize          _M_width;
240     fmtflags            _M_flags;
241
242     // 27.4.2.6  Members for callbacks
243     // 27.4.2.6  ios_base callbacks
244     struct _Callback_list
245     {
246       // Data Members
247       _Callback_list*           _M_next;
248       ios_base::event_callback  _M_fn;
249       int                       _M_index;
250       _Atomic_word              _M_refcount;  // 0 means one reference.
251     
252       _Callback_list(ios_base::event_callback __fn, int __index, 
253                      _Callback_list* __cb)
254       : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { }
255       
256       void 
257       _M_add_reference() { __atomic_add(&_M_refcount, 1); }
258
259       int 
260       _M_remove_reference() { return __exchange_and_add(&_M_refcount, -1); }
261       // 0 => OK to delete
262     };
263
264      _Callback_list*    _M_callbacks;
265
266     void 
267     _M_call_callbacks(event __ev) throw();
268
269     void 
270     _M_dispose_callbacks(void);
271
272     // 27.4.2.5  Members for iword/pword storage
273     struct _Words 
274     { 
275       void*     _M_pword; 
276       long      _M_iword; 
277     };
278
279     static const int    _S_local_words = 8;
280     _Words              _M_word_array[_S_local_words];  // Guaranteed storage
281     _Words              _M_dummy;    // Only for failed iword/pword calls.
282     _Words*             _M_words;
283     int                 _M_word_limit;
284  
285     _Words& 
286     _M_grow_words(int __index);
287
288     // Members for locale and locale caching.
289     locale              _M_ios_locale;
290
291     void 
292     _M_init();
293
294   public:
295
296     // 27.4.2.1.6  Class ios_base::Init
297     // Used to initialize standard streams. In theory, g++ could use
298     // -finit-priority to order this stuff correctly without going
299     // through these machinations. 
300     class Init 
301     {
302       friend class ios_base;
303     public:
304       Init();
305       ~Init();
306       
307       static void
308       _S_ios_create(bool __sync);
309       
310       static void
311       _S_ios_destroy();
312
313     private:
314       static int        _S_ios_base_init;
315       static bool       _S_synced_with_stdio;
316     };
317
318     // Fmtflags state:
319     inline fmtflags 
320     flags() const { return _M_flags; }
321
322     inline fmtflags 
323     flags(fmtflags __fmtfl)
324     { 
325       fmtflags __old = _M_flags; 
326       _M_flags = __fmtfl; 
327       return __old; 
328     }
329
330     inline fmtflags 
331     setf(fmtflags __fmtfl)
332     { 
333       fmtflags __old = _M_flags; 
334       _M_flags |= __fmtfl; 
335       return __old; 
336     }
337
338     inline fmtflags 
339     setf(fmtflags __fmtfl, fmtflags __mask)
340     {
341       fmtflags __old = _M_flags;
342       _M_flags &= ~__mask;
343       _M_flags |= (__fmtfl & __mask);
344       return __old;
345     }
346
347     inline void 
348     unsetf(fmtflags __mask) { _M_flags &= ~__mask; }
349
350     inline streamsize 
351     precision() const { return _M_precision; }
352
353     inline streamsize 
354     precision(streamsize __prec)
355     { 
356       streamsize __old = _M_precision; 
357       _M_precision = __prec; 
358       return __old; 
359     }
360
361     inline streamsize 
362     width() const { return _M_width; }
363
364     inline streamsize 
365     width(streamsize __wide)
366     { 
367       streamsize __old = _M_width; 
368       _M_width = __wide; 
369       return __old; 
370     }
371
372     static bool 
373     sync_with_stdio(bool __sync = true);
374
375     // Locales:
376     locale 
377     imbue(const locale& __loc);
378
379     inline locale 
380     getloc() const { return _M_ios_locale; }
381
382     // Storage:
383     static int 
384     xalloc() throw();
385
386     inline long& 
387     iword(int __ix)
388     {
389       _Words& __word = (__ix < _M_word_limit) 
390                         ? _M_words[__ix] : _M_grow_words(__ix);
391       return __word._M_iword;
392     }
393
394     inline void*& 
395     pword(int __ix)
396     {
397       _Words& __word = (__ix < _M_word_limit) 
398                         ? _M_words[__ix] : _M_grow_words(__ix);
399       return __word._M_pword;
400     }
401
402     // Destructor
403     ~ios_base();
404
405   protected:
406     ios_base();
407
408 #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
409   //50.  Copy constructor and assignment operator of ios_base
410   private:
411     ios_base(const ios_base&);
412
413     ios_base& 
414     operator=(const ios_base&);
415 #endif
416   };
417  
418   // 27.4.5.1 fmtflags manipulators:
419   inline ios_base& 
420   boolalpha(ios_base& __base)
421   {
422     __base.setf(ios_base::boolalpha);
423     return __base;
424   }
425
426   inline ios_base& 
427   noboolalpha(ios_base& __base)
428   {
429     __base.unsetf(ios_base::boolalpha);
430     return __base;
431   }
432
433   inline ios_base& 
434   showbase(ios_base& __base)
435   {
436     __base.setf(ios_base::showbase);
437     return __base;
438   }
439
440   inline ios_base& 
441   noshowbase(ios_base& __base)
442   {
443     __base.unsetf(ios_base::showbase);
444     return __base;
445   }
446
447   inline ios_base& 
448   showpoint(ios_base& __base)
449   {
450     __base.setf(ios_base::showpoint);
451     return __base;
452   }
453
454   inline ios_base& 
455   noshowpoint(ios_base& __base)
456   {
457     __base.unsetf(ios_base::showpoint);
458     return __base;
459   }
460
461   inline ios_base& 
462   showpos(ios_base& __base)
463   {
464     __base.setf(ios_base::showpos);
465     return __base;
466   }
467
468   inline ios_base& 
469   noshowpos(ios_base& __base)
470   {
471     __base.unsetf(ios_base::showpos);
472     return __base;
473   }
474
475   inline ios_base& 
476   skipws(ios_base& __base)
477   {
478     __base.setf(ios_base::skipws);
479     return __base;
480   }
481   
482   inline ios_base& 
483   noskipws(ios_base& __base)
484   {
485     __base.unsetf(ios_base::skipws);
486     return __base;
487   }
488
489   inline ios_base& 
490   uppercase(ios_base& __base)
491   {
492     __base.setf(ios_base::uppercase);
493     return __base;
494   }
495
496   inline ios_base& 
497   nouppercase(ios_base& __base)
498   {
499     __base.unsetf(ios_base::uppercase);
500     return __base;
501   }
502
503   inline ios_base& 
504   unitbuf(ios_base& __base)
505   {
506      __base.setf(ios_base::unitbuf);      
507      return __base;
508   }
509
510   inline ios_base& 
511   nounitbuf(ios_base& __base)
512   {
513      __base.unsetf(ios_base::unitbuf);
514      return __base;    
515   }
516
517   // 27.4.5.2 adjustfield anipulators:
518   inline ios_base& 
519   internal(ios_base& __base)
520   {
521      __base.setf(ios_base::internal, ios_base::adjustfield);
522      return __base;    
523   }
524
525   inline ios_base& 
526   left(ios_base& __base)
527   {
528     __base.setf(ios_base::left, ios_base::adjustfield);
529     return __base;
530   }
531   
532   inline ios_base& 
533   right(ios_base& __base)
534   {
535     __base.setf(ios_base::right, ios_base::adjustfield);
536     return __base;
537   }
538   
539   // 27.4.5.3 basefield anipulators:
540   inline ios_base& 
541   dec(ios_base& __base)
542   {
543     __base.setf(ios_base::dec, ios_base::basefield);
544     return __base;
545   }
546   
547   inline ios_base& 
548   hex(ios_base& __base)
549   {
550     __base.setf(ios_base::hex, ios_base::basefield);
551     return __base;
552   }
553
554   inline ios_base& 
555   oct(ios_base& __base)
556   {
557     __base.setf(ios_base::oct, ios_base::basefield);
558     return __base;
559   }
560   
561   // 27.4.5.4 floatfield anipulators:
562   inline ios_base& 
563   fixed(ios_base& __base)
564   {
565     __base.setf(ios_base::fixed, ios_base::floatfield);
566     return __base;
567   }
568
569   inline ios_base& 
570   scientific(ios_base& __base)
571   {
572     __base.setf(ios_base::scientific, ios_base::floatfield);
573     return __base;
574   }
575
576 } // namespace std
577
578 #endif /* _CPP_BITS_IOSBASE_H */
579