|
|
1.1 ! root 1: /* This is part of libio/iostream, providing -*- C++ -*- input/output. ! 2: Copyright (C) 1993 Free Software Foundation ! 3: ! 4: This file is part of the GNU IO Library. This library is free ! 5: software; you can redistribute it and/or modify it under the ! 6: terms of the GNU General Public License as published by the ! 7: Free Software Foundation; either version 2, or (at your option) ! 8: any later version. ! 9: ! 10: This library is distributed in the hope that it will be useful, ! 11: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 13: GNU General Public License for more details. ! 14: ! 15: You should have received a copy of the GNU General Public License ! 16: along with GNU CC; see the file COPYING. If not, write to ! 17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 18: ! 19: As a special exception, if you link this library with files ! 20: compiled with a GNU compiler to produce an executable, this does not cause ! 21: the resulting executable to be covered by the GNU General Public License. ! 22: This exception does not however invalidate any other reasons why ! 23: the executable file might be covered by the GNU General Public License. */ ! 24: ! 25: #ifndef _IOMANIP_H ! 26: // ! 27: // Not specifying `pragma interface' causes the compiler to emit the ! 28: // template definitions in the files, where they are used. ! 29: // ! 30: //#ifdef __GNUG__ ! 31: //#pragma interface ! 32: //#endif ! 33: #pragma cplusplus ! 34: ! 35: #define _IOMANIP_H ! 36: ! 37: #include <iostream.h> ! 38: ! 39: //----------------------------------------------------------------------------- ! 40: // Parametrized Manipulators as specified by ANSI draft ! 41: //----------------------------------------------------------------------------- ! 42: ! 43: //----------------------------------------------------------------------------- ! 44: // Stream Manipulators ! 45: //----------------------------------------------------------------------------- ! 46: // ! 47: template<class TP> class smanip; // TP = Type Param ! 48: ! 49: template<class TP> class sapp { ! 50: ios& (*_f)(ios&, TP); ! 51: public: ! 52: sapp(ios& (*f)(ios&, TP)) : _f(f) {} ! 53: // ! 54: smanip<TP> operator()(TP a) ! 55: { return smanip<TP>(_f, a); } ! 56: }; ! 57: ! 58: template <class TP> class smanip { ! 59: ios& (*_f)(ios&, TP); ! 60: TP _a; ! 61: public: ! 62: smanip(ios& (*f)(ios&, TP), TP a) : _f(f), _a(a) {} ! 63: // ! 64: friend ! 65: istream& operator>>(istream& i, const smanip<TP>& m); ! 66: friend ! 67: ostream& operator<<(ostream& o, const smanip<TP>& m); ! 68: }; ! 69: ! 70: template<class TP> ! 71: inline istream& operator>>(istream& i, const smanip<TP>& m) ! 72: { (*m._f)(i, m._a); return i; } ! 73: ! 74: template<class TP> ! 75: inline ostream& operator<<(ostream& o, const smanip<TP>& m) ! 76: { (*m._f)(o, m._a); return o;} ! 77: ! 78: //----------------------------------------------------------------------------- ! 79: // Input-Stream Manipulators ! 80: //----------------------------------------------------------------------------- ! 81: // ! 82: template<class TP> class imanip; ! 83: ! 84: template<class TP> class iapp { ! 85: istream& (*_f)(istream&, TP); ! 86: public: ! 87: iapp(ostream& (*f)(istream&,TP)) : _f(f) {} ! 88: // ! 89: imanip<TP> operator()(TP a) ! 90: { return imanip<TP>(_f, a); } ! 91: }; ! 92: ! 93: template <class TP> class imanip { ! 94: istream& (*_f)(istream&, TP); ! 95: TP _a; ! 96: public: ! 97: imanip(istream& (*f)(istream&, TP), TP a) : _f(f), _a(a) {} ! 98: // ! 99: friend ! 100: istream& operator>>(istream& i, const imanip<TP>& m) ! 101: { return (*m._f)( i, m._a); } ! 102: }; ! 103: ! 104: ! 105: //----------------------------------------------------------------------------- ! 106: // Output-Stream Manipulators ! 107: //----------------------------------------------------------------------------- ! 108: // ! 109: template<class TP> class omanip; ! 110: ! 111: template<class TP> class oapp { ! 112: ostream& (*_f)(ostream&, TP); ! 113: public: ! 114: oapp(ostream& (*f)(ostream&,TP)) : _f(f) {} ! 115: // ! 116: omanip<TP> operator()(TP a) ! 117: { return omanip<TP>(_f, a); } ! 118: }; ! 119: ! 120: template <class TP> class omanip { ! 121: ostream& (*_f)(ostream&, TP); ! 122: TP _a; ! 123: public: ! 124: omanip(ostream& (*f)(ostream&, TP), TP a) : _f(f), _a(a) {} ! 125: // ! 126: friend ! 127: ostream& operator<<(ostream& o, omanip<TP>& m) ! 128: { return (*m._f)(o, m._a); } ! 129: }; ! 130: ! 131: ! 132: //----------------------------------------------------------------------------- ! 133: // Available Manipulators ! 134: //----------------------------------------------------------------------------- ! 135: ! 136: // ! 137: // Macro to define an iomanip function, with one argument ! 138: // The underlying function is `__iomanip_<name>' ! 139: // ! 140: #define __DEFINE_IOMANIP_FN1(type,param,function) \ ! 141: extern ios& __iomanip_##function (ios&, param); \ ! 142: inline type<param> function (param n) \ ! 143: { return type<param> (__iomanip_##function, n); } ! 144: ! 145: __DEFINE_IOMANIP_FN1( smanip, int, setbase) ! 146: __DEFINE_IOMANIP_FN1( smanip, int, setfill) ! 147: __DEFINE_IOMANIP_FN1( smanip, int, setprecision) ! 148: __DEFINE_IOMANIP_FN1( smanip, int, setw) ! 149: ! 150: __DEFINE_IOMANIP_FN1( smanip, ios::fmtflags, resetiosflags) ! 151: __DEFINE_IOMANIP_FN1( smanip, ios::fmtflags, setiosflags) ! 152: ! 153: #endif /*!_IOMANIP_H*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.