// -*- C++ -*-
/***************************************************************************
 *
 * iomanip - Declarations of iostream manipulators
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2008 Rogue Wave Software, Inc.
 * 
 **************************************************************************/

#ifndef _RWSTD_IOMANIP_INCLUDED
#define _RWSTD_IOMANIP_INCLUDED

#include <iosfwd>

#include <rw/_iosbase.h>
#include <rw/_defs.h>


_RWSTD_NAMESPACE (__rw) {


// resetiosflags implementation
struct __rw_resetiosflags
{
    void operator() (_STD::ios_base           &__strm,
                     _STD::ios_base::fmtflags  __mask) const {
        __strm.setf (_STD::ios_base::fmtflags (0), __mask);
    }
};


// setiosflags implementation
struct __rw_setiosflags
{
    void operator() (_STD::ios_base           &__strm,
                     _STD::ios_base::fmtflags  __mask) const {
        __strm.setf (__mask);
    }
};


// setbase implementation
struct __rw_setbase
{
    void operator() (_STD::ios_base &__strm, int __base) const {

#ifndef _RWSTD_NO_EXT_SETBASE

        if (__base < 0 || __base > 36)
            __base = 0;

#else   // if defined (_RWSTD_NO_EXT_SETBASE)

        switch (__base) {
        case 0: case 8: case 10: case 16: break;

#  ifndef _RWSTD_NO_EXT_BIN_IO

        case 2: break;

#  endif   // _RWSTD_NO_EXT_BIN_IO

        default: __base = 0;
        }

#endif   // _RWSTD_NO_EXT_SETBASE

        const unsigned __ifl =
              __strm.flags () & ~_STD::ios_base::basefield
            & ~(   _RWSTD_STATIC_CAST (unsigned, _RWSTD_IOS_BASEMASK)
                << _RWSTD_IOS_BASEOFF)
            | __base << _RWSTD_IOS_BASEOFF;

        __strm.flags (_STD::ios_base::fmtflags (__ifl));
    }
};


// setfill implementation
template <class _CharT>
struct __rw_setfill
{
    template <class _Traits>
    void operator() (_STD::basic_ios<_CharT, _Traits> &__strm,
                     _CharT                            __ch) const {
        __strm.fill (__ch);
    }
};


// setprecision implementation
struct __rw_setprecision
{
    void operator() (_STD::ios_base &__strm, int __prec) const {
        __strm.precision (_RWSTD_STATIC_CAST (_RWSTD_STREAMSIZE, __prec));
    }
};


// setw implementation
struct __rw_setw
{
    void operator() (_STD::ios_base &__strm, int __width) const {
        __strm.width (_RWSTD_STATIC_CAST (_RWSTD_STREAMSIZE, __width));
    }
};


}   // namespace __rw
 

_RWSTD_NAMESPACE (std) { 

  
// manipulator implementation
template <class _Functor, class _TypeT>
struct __rw_smanip
{
    explicit
    __rw_smanip (_TypeT __arg)
        : _C_fun (), _C_arg (__arg) { /* empty */ }

    __rw_smanip (_Functor __fun, _TypeT __arg)
        : _C_fun (__fun), _C_arg (__arg) { /* empty */ }
      
    _Functor _C_fun;
    _TypeT   _C_arg;
};
 

// 27.6.3, p3
inline __rw_smanip<_RW::__rw_resetiosflags, ios_base::fmtflags>
resetiosflags (ios_base::fmtflags __mask)
{
    return __rw_smanip<_RW::__rw_resetiosflags, ios_base::fmtflags>(__mask);
}
 

// 27.6.3, p4
inline __rw_smanip<_RW::__rw_setiosflags, ios_base::fmtflags>
setiosflags (ios_base::fmtflags __mask)
{
    return __rw_smanip<_RW::__rw_setiosflags, ios_base::fmtflags>(__mask);
}


// 27.6.3, p5
inline __rw_smanip<_RW::__rw_setbase, int>
setbase (int __base)
{
    return __rw_smanip<_RW::__rw_setbase, int>(__base);
}


// 27.6.3, p6
template <class _CharT>
inline __rw_smanip<_RW::__rw_setfill<_CharT>, _CharT>
setfill (_CharT __ch)
{
    return __rw_smanip<_RW::__rw_setfill<_CharT>, _CharT>(__ch);
}


// 27.6.3, p7
inline __rw_smanip<_RW::__rw_setprecision, int>
setprecision (int __prec)
{
    return __rw_smanip<_RW::__rw_setprecision, int>(__prec);
}


// 27.6.3, p8
inline __rw_smanip<_RW::__rw_setw, int>
setw (int __width)
{
    return __rw_smanip<_RW::__rw_setw, int>(__width);
}


// implementation of manipulator extractor
template <class _CharT, class _Traits, class _Functor, class _TypeT>
inline basic_istream<_CharT, _Traits>&
operator>> (basic_istream<_CharT, _Traits>      &__strm,
            const __rw_smanip<_Functor, _TypeT> &__man)
{
    _TRY {
        __man._C_fun (__strm, __man._C_arg);
    }
    _CATCH (...) {
        __strm.setstate (ios_base::badbit);
    }
  
    return __strm;
}


// implementation of manipulator inserter
template <class _CharT, class _Traits, class _Functor, class _TypeT>
inline basic_ostream<_CharT, _Traits>&
operator<< (basic_ostream<_CharT, _Traits>      &__strm,
            const __rw_smanip<_Functor, _TypeT> &__man)
{
    _TRY {
        __man._C_fun (__strm, __man._C_arg);
    }
    _CATCH (...) {
        __strm.setstate (ios_base::badbit);
    }

    return __strm;
}

}   // namespace std


#endif   // _RWSTD_IOMANIP_INCLUDED
