/***************************************************************************
 *
 * _iosbase.h - Declarations for the Standard Library basic stream I/O
 *
 * This is an internal header file used to implement the C++ Standard
 * Library. It should never be #included directly by a program.
 *
 * $Id: //stdlib/dev/include/rw/_iosbase.h#42 $
 *
 ***************************************************************************
 *
 * Copyright (c) 1994-2005 Quovadx,  Inc., acting through its  Rogue Wave
 * Software division. Licensed 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.
 * 
 **************************************************************************/

#ifndef _RWSTD_IOSBASE_H_INCLUDED
#define _RWSTD_IOSBASE_H_INCLUDED


#include <loc/_locale.h>

#include <rw/_iosfailure.h>
#include <rw/_iosfwd.h>
#include <rw/_traits.h>

#include <rw/_defs.h>


_RWSTD_NAMESPACE (std) {


struct _RWSTD_EXPORT ios_base: _RW::__rw_synchronized
{
    // 27.4.2.1.1
    typedef _RW::__rw_failure failure;

#ifndef _RWSTD_NO_EXT_FAILURE

    // extensions
    typedef _RW::__rw_badbit_set  badbit_set;
    typedef _RW::__rw_eofbit_set  eofbit_set;
    typedef _RW::__rw_failbit_set failbit_set;

#endif   // _RWSTD_NO_EXT_FAILURE

    // 27.4.2.1.2
    typedef _RWSTD_BITMASK_ENUM (_RW::__rw_fmtflags) fmtflags;

    // insert and extract bool type in alphabetic format 
    _RWSTD_STATIC_CONST (fmtflags, boolalpha = _RW::__rw_boolalpha);

    // converts integer input or generates integer output in decimal base
    _RWSTD_STATIC_CONST (fmtflags, dec = _RW::__rw_dec);

    // generate floating-point output in fixed-point notation
    _RWSTD_STATIC_CONST (fmtflags, fixed = _RW::__rw_fixed);

    // converts integer input or generates integer output in hexadecimal base
    _RWSTD_STATIC_CONST (fmtflags, hex = _RW::__rw_hex);

    // adds fill characters at a designated internal point in certain generated
    // output, or identical to right if no such point is designated
    _RWSTD_STATIC_CONST (fmtflags, internal = _RW::__rw_internal);

    // adds fill characters on the right of certain generated output
    _RWSTD_STATIC_CONST (fmtflags, left = _RW::__rw_left);

    // converts integer input or generates integer output in octal base
    _RWSTD_STATIC_CONST (fmtflags, oct = _RW::__rw_oct);

    // adds fill characters on the left of certain generated output
    _RWSTD_STATIC_CONST (fmtflags, right = _RW::__rw_right);

    // generates floating-point output in scientific notation
    _RWSTD_STATIC_CONST (fmtflags, scientific = _RW::__rw_scientific);

    // generates a prefix indicating the numeric base of generated integer
    // output (bin - none, oct - "0", dec - none, hex - "0x")
    _RWSTD_STATIC_CONST (fmtflags, showbase = _RW::__rw_showbase);

    // generates a decimal-point character unconditionally in generated
    // floating-point output
    _RWSTD_STATIC_CONST (fmtflags, showpoint = _RW::__rw_showpoint);

    // generates a + sign in non-negative generated numeric output
    _RWSTD_STATIC_CONST (fmtflags, showpos = _RW::__rw_showpos);

    // skips leading white space before certain input operations
    _RWSTD_STATIC_CONST (fmtflags, skipws = _RW::__rw_skipws);

    // flushes output after each output operation
    _RWSTD_STATIC_CONST (fmtflags, unitbuf = _RW::__rw_unitbuf);

    // replaces certain lowercase letters with their uppercase equivalents
    // in generated output
    _RWSTD_STATIC_CONST (fmtflags, uppercase = _RW::__rw_uppercase);

#ifndef _RWSTD_NO_EXT_BIN_IO

    // extension - converts integer input or generates integer output
    // in binary base
    _RWSTD_STATIC_CONST (fmtflags, bin = _RW::__rw_bin);

#endif   // _RWSTD_NO_EXT_BIN_IO

    _RWSTD_STATIC_CONST (fmtflags, basefield = _RW::__rw_basefield);
    _RWSTD_STATIC_CONST (fmtflags, adjustfield = _RW::__rw_adjustfield);
    _RWSTD_STATIC_CONST (fmtflags, floatfield = _RW::__rw_floatfield);

#ifndef _RWSTD_NO_EXT_REENTRANT_IO

    // extension: never locks the object in MT environments
    _RWSTD_STATIC_CONST (fmtflags, nolock = _RW::__rw_nolock);

    // extension: never locks stream buffer in MT environments
    _RWSTD_STATIC_CONST (fmtflags, nolockbuf = _RW::__rw_nolockbuf);

#endif   // _RWSTD_NO_EXT_REENTRANT_IO

    // 27.4.2.1.3
    typedef _RWSTD_BITMASK_ENUM (_RW::__rw_iostate) iostate;

    _RWSTD_STATIC_CONST (iostate, goodbit = _RW::__rw_goodbit);

    // indicates a loss of integrity in an input or output sequence
    // (such as an irrecoverable read error from a file); 
    _RWSTD_STATIC_CONST (iostate, badbit = _RW::__rw_badbit);

    // indicates that an input operation reached the end of an input sequence
    _RWSTD_STATIC_CONST (iostate, eofbit = _RW::__rw_eofbit);

    // indicates that an input operation failed to read the expected
    // characters, or that an output operation failed to generate the
    // desired characters
    _RWSTD_STATIC_CONST (iostate, failbit = _RW::__rw_failbit);

    // 27.4.2.1.4
    typedef _RWSTD_BITMASK_ENUM (_RW::__rw_openmode) openmode;

    // seek to end before each write 
    _RWSTD_STATIC_CONST (openmode, app = _RW::__rw_app);

    // perform input and output in binary mode (as opposed to text mode)
    _RWSTD_STATIC_CONST (openmode, binary = _RW::__rw_binary);

    // open for input
    _RWSTD_STATIC_CONST (openmode, in = _RW::__rw_in);

    // open for output
    _RWSTD_STATIC_CONST (openmode, out = _RW::__rw_out);

    // truncate an existing stream when opening
    _RWSTD_STATIC_CONST (openmode, trunc = _RW::__rw_trunc);

    // open and seek to end immediately after opening 
    _RWSTD_STATIC_CONST (openmode, ate = _RW::__rw_ate);

#ifndef _RWSTD_STRICT_ANSI

    // extensions for compatibility with Classic Iostreams

    // do not create a file if it doesn't exist
    _RWSTD_STATIC_CONST (openmode, nocreate = _RW::__rw_nocreate);

    // do not replace an existing file
    _RWSTD_STATIC_CONST (openmode, noreplace = _RW::__rw_noreplace);

#endif   // _RWSTD_STRICT_ANSI

#ifndef _RWSTD_NO_EXT_STDIO

    // use the C stdio library for all file I/O
    _RWSTD_STATIC_CONST (openmode, stdio = _RW::__rw_stdio);

    // use the native OS calls for all file I/O
    _RWSTD_STATIC_CONST (openmode, native = _RW::__rw_native);

#endif   // _RWSTD_NO_EXT_STDIO

    typedef _RWSTD_BITMASK_ENUM (_RW::__rw_seekdir) seekdir;

    // 27.4.2.1.5, p1
    _RWSTD_STATIC_CONST (seekdir, beg = _RW::__rw_beg);
    _RWSTD_STATIC_CONST (seekdir, cur = _RW::__rw_cur);
    _RWSTD_STATIC_CONST (seekdir, end = _RW::__rw_end);

#ifndef _RWSTD_NO_DEPRECATED    

    // D.6, p1
    typedef seekdir          seek_dir;
    typedef openmode         open_mode;
    typedef iostate          io_state;
    typedef _RWSTD_STREAMOFF streamoff;
    typedef _RWSTD_STREAMOFF streampos;

#endif // _RWSTD_NO_DEPRECATED    
    
    // 27.4.2.1.6
    struct _RWSTD_EXPORT Init {
        Init ();

        ~Init ();
    };

    // 27.4.2.2, p1
    fmtflags flags () const {
        return fmtflags (_C_fmtfl);
    }

    // 27.4.2.2, p2
    fmtflags flags (fmtflags);

    // 27.4.2.2, p4
    fmtflags setf (fmtflags __f) {
        return flags (flags () | __f);
    }

    // 27.4.2.2, p6
    fmtflags setf (fmtflags __f, fmtflags __mask) {
        return flags (flags () & ~__mask | __f & __mask);
    }

    // 27.4.2.2, p8
    void unsetf (fmtflags __f) {
        flags (flags () & ~__f);
    }

    // 27.4.2.2, p9
    _RWSTD_STREAMSIZE precision () const {
        return _C_prec;
    }

    // 27.4.2.2, p10
    _RWSTD_STREAMSIZE precision (_RWSTD_STREAMSIZE);

    // 27.4.2.2, p12
    _RWSTD_STREAMSIZE width () const {
        return _C_wide;
    }

    // 27.4.2.2, p13
    _RWSTD_STREAMSIZE width (_RWSTD_STREAMSIZE);

    // 27.4.2.3, p1
    locale imbue (const locale&);

    // extension: avoids reference counting in MT builds (may result in
    // a speedup of up to 50%); this is an alternative to caching a reference
    // (pointer) to a facet in each stream and stream buffer object
    locale& getloc () {
        return _C_loc;
    }

    // 27.4.2.3, p4
    locale getloc () const {
        return _C_loc;
    }

    // 27.4.2.5, p1
    static int xalloc ();

    // 27.4.2.5, p2
    long& iword (int);

    // 27.4.2.5, p4
    void*& pword (int);

    enum event { erase_event, imbue_event, copyfmt_event };

    typedef void (*event_callback)(event, ios_base&, int);

    // 27.5.2.6, p1
    void register_callback (event_callback, int);
    
    // 27.4.2.4, p1
    static bool sync_with_stdio (bool = true);

    // 27.5.2.7, p2
    virtual ~ios_base ();    

    // returns a numeric base as per 22.2.2.1.2, p4
    int _C_base () const {
        return _RWSTD_STATIC_CAST (unsigned, flags ()) >> _RWSTD_IOS_BASEOFF;
    }

protected:

    // 27.5.2.7, p1
    ios_base ();

    // implements basic_ios<T>::init()
    void _C_init (void*);

    // will be reentrant only if `reentrant' is true
    void _C_fire_event (event, bool __reentrant);

    // implements basic_ios<T>::copyfmt()
    void _C_copyfmt (const ios_base&, void*, const void*, _RWSTD_SIZE_T);

    // sets state, exceptions, and rdbuf to the function arguments
    // in that order (except state & ~_RWSTD_IOS_NOTHROW)
    // may throw except when _RWSTD_IOS_NOTHROW is set in the first
    // argument; returns the previous value of rdbuf
    void* _C_set (unsigned, unsigned, void*);

    // retrieves and sets the tied stream pointer
    void* _C_tie () const;
    void* _C_tie (void*);

    // called from basic_ios<>::imbue (), not thread safe
    locale _C_unsafe_imbue (const locale&);

    void              *_C_rdbuf;    // pointer to the associated stream buffer
    _RWSTD_STREAMSIZE  _C_prec;     // current precision
    _RWSTD_STREAMSIZE  _C_wide;     // current width
    unsigned           _C_fmtfl;    // formatting flags
    unsigned char      _C_state;    // stream state
    unsigned char      _C_except;   // active exceptions
    
    static bool _C_sync_with_stdio;

private:

    ios_base (const ios_base&);               // not defined
    ios_base& operator= (const ios_base&);    // not defined

#if __EDG_VERSION__ < 245

    // working around an EDG eccp 2.3x bug (also derivatives,
    // such as MIPSpro, see PR #28631)
public:
    struct _C_usr_data;

#else

protected:
    struct _C_usr_data;

#endif   // EDG < 2.45

protected:
    _C_usr_data *_C_usr;      // user data (iword, pword, callbacks)
    locale       _C_loc;      // locale associated with stream

    friend struct _RWSTD_EXPORT Init;

    // working around an EDG eccp 3.2 and prior bug (see PR #29526)
    friend struct _C_usr_data;
};


inline _RWSTD_STREAMSIZE ios_base::
width (_RWSTD_STREAMSIZE __width)
{
    _RWSTD_ASSERT (0 != this);

    const _RWSTD_STREAMSIZE __tmp = _C_wide;

    // not thread-safe for efficiency since width(0) is called
    // (directly or through a facet) by each formatted output
    // function and the return value is not used
    _C_wide = __width;

    return __tmp;
}


}   // namespace std


#endif   // _RWSTD_IOSBASE_H_INCLUDED
