From 6599da043e22e96ac830fb50a61c1b6d95d1b142 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 21 Aug 1997 18:57:35 -0400 Subject: Initial revision From-SVN: r14877 --- libio/iomanip.h | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 libio/iomanip.h (limited to 'libio/iomanip.h') diff --git a/libio/iomanip.h b/libio/iomanip.h new file mode 100644 index 00000000000..fe1156569b4 --- /dev/null +++ b/libio/iomanip.h @@ -0,0 +1,165 @@ +/* This is part of libio/iostream, providing -*- C++ -*- input/output. +Copyright (C) 1993 Free Software Foundation + +This file is part of the GNU IO Library. This library is free +software; you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) +any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this library; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +#ifndef _IOMANIP_H +#ifdef __GNUG__ +#pragma interface +#endif +#define _IOMANIP_H + +#include + +extern "C++" { +//----------------------------------------------------------------------------- +// Parametrized Manipulators as specified by ANSI draft +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Stream Manipulators +//----------------------------------------------------------------------------- +// +template class smanip; // TP = Type Param + +template class sapp { + ios& (*_f)(ios&, TP); +public: + sapp(ios& (*f)(ios&, TP)) : _f(f) {} + // + smanip operator()(TP a) + { return smanip(_f, a); } +}; + +template class smanip { + ios& (*_f)(ios&, TP); + TP _a; +public: + smanip(ios& (*f)(ios&, TP), TP a) : _f(f), _a(a) {} + // + friend + istream& operator>>(istream& i, const smanip& m); + friend + ostream& operator<<(ostream& o, const smanip& m); +}; + +#ifdef __GNUG__ +extern template class smanip; +extern template class smanip; +#endif + +template +inline istream& operator>>(istream& i, const smanip& m) +{ (*m._f)(i, m._a); return i; } + +template +inline ostream& operator<<(ostream& o, const smanip& m) +{ (*m._f)(o, m._a); return o;} + +#ifdef __GNUG__ +extern template istream& operator>>(istream&, const smanip&); +extern template istream& operator>>(istream&, const smanip&); +extern template ostream& operator<<(ostream&, const smanip&); +extern template ostream& operator<<(ostream&, const smanip&); +#endif + +//----------------------------------------------------------------------------- +// Input-Stream Manipulators +//----------------------------------------------------------------------------- +// +template class imanip; + +template class iapp { + istream& (*_f)(istream&, TP); +public: + iapp(istream& (*f)(istream&,TP)) : _f(f) {} + // + imanip operator()(TP a) + { return imanip(_f, a); } +}; + +template class imanip { + istream& (*_f)(istream&, TP); + TP _a; +public: + imanip(istream& (*f)(istream&, TP), TP a) : _f(f), _a(a) {} + // + friend + istream& operator>>(istream& i, const imanip& m); +}; + +template +inline istream& operator>>(istream& i, const imanip& m) +{ return (*m._f)( i, m._a); } + +//----------------------------------------------------------------------------- +// Output-Stream Manipulators +//----------------------------------------------------------------------------- +// +template class omanip; + +template class oapp { + ostream& (*_f)(ostream&, TP); +public: + oapp(ostream& (*f)(ostream&,TP)) : _f(f) {} + // + omanip operator()(TP a) + { return omanip(_f, a); } +}; + +template class omanip { + ostream& (*_f)(ostream&, TP); + TP _a; +public: + omanip(ostream& (*f)(ostream&, TP), TP a) : _f(f), _a(a) {} + // + friend + ostream& operator<<(ostream& o, const omanip& m); +}; + +template +inline ostream& operator<<(ostream& o, const omanip& m) +{ return (*m._f)(o, m._a); } + +//----------------------------------------------------------------------------- +// Available Manipulators +//----------------------------------------------------------------------------- + +// +// Macro to define an iomanip function, with one argument +// The underlying function is `__iomanip_' +// +#define __DEFINE_IOMANIP_FN1(type,param,function) \ + extern ios& __iomanip_##function (ios&, param); \ + inline type function (param n) \ + { return type (__iomanip_##function, n); } + +__DEFINE_IOMANIP_FN1( smanip, int, setbase) +__DEFINE_IOMANIP_FN1( smanip, int, setfill) +__DEFINE_IOMANIP_FN1( smanip, int, setprecision) +__DEFINE_IOMANIP_FN1( smanip, int, setw) + +__DEFINE_IOMANIP_FN1( smanip, ios::fmtflags, resetiosflags) +__DEFINE_IOMANIP_FN1( smanip, ios::fmtflags, setiosflags) +} // extern "C++" + +#endif /*!_IOMANIP_H*/ -- cgit v1.2.3