// -*- C++ -*-
/***************************************************************************
 *
 * iosfwd - forward declarations for the iostreams
 *
 * $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-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#ifndef _RWSTD_IOSFWD_INCLUDED
#define _RWSTD_IOSFWD_INCLUDED

#include <rw/_iosfwd.h>
#include <rw/_mbstate.h>   // for _RWSTD_MBSTATE_T


_RWSTD_NAMESPACE (std) { 


template <class _TypeT>
class allocator;


#ifndef _RWSTD_RW_BASIC_IOS_H_INCLUDED

_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_ios;

typedef basic_ios<char> ios;

#  ifndef _RWSTD_NO_WCHAR_T

typedef basic_ios<wchar_t> wios;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_RW_BASIC_IOS_H_INCLUDED


#ifndef _RWSTD_STREAMBUF_INCLUDED

_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_streambuf;

typedef basic_streambuf<char> streambuf;

#  ifndef _RWSTD_NO_WCHAR_T

typedef basic_streambuf<wchar_t> wstreambuf;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_STREAMBUF_INCLUDED


#ifndef _RWSTD_ISTREAM_INCLUDED

// 27.2, p4
_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_istream;

// 27.2, p6
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_iostream;


typedef basic_istream<char>  istream;
typedef basic_iostream<char> iostream;

#  ifndef _RWSTD_NO_WCHAR_T

typedef basic_istream<wchar_t>  wistream;
typedef basic_iostream<wchar_t> wiostream;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_ISTREAM_INCLUDED


#ifndef _RWSTD_OSTREAM_INCLUDED

// 27.2, p5
_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_ostream;

typedef basic_ostream<char, char_traits<char> > ostream;

#  ifndef _RWSTD_NO_WCHAR_T

typedef basic_ostream<wchar_t, char_traits<wchar_t> > wostream;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_OSTREAM_INCLUDED


#ifndef _RWSTD_SSTREAM_INCLUDED

_EXPORT
template <class _CharT,
          class _Traits = char_traits<_CharT>,
          class _Allocator = allocator<_CharT> > 
class basic_stringbuf;

template <class _CharT,
          class _Traits = char_traits<_CharT>,
          class _Allocator = allocator<_CharT>  > 
class basic_istringstream;

template <class _CharT,
          class _Traits = char_traits<_CharT>,
          class _Allocator = allocator<_CharT> > 
class basic_ostringstream;

template <class _CharT,
          class _Traits = char_traits<_CharT>,
          class _Allocator = allocator<_CharT>  > 
class basic_stringstream;

typedef basic_stringbuf<char>     stringbuf;
typedef basic_istringstream<char> istringstream;
typedef basic_ostringstream<char> ostringstream;
typedef basic_stringstream<char>  stringstream;

#  ifndef _RWSTD_NO_WCHAR_T

typedef basic_stringbuf<wchar_t>     wstringbuf;
typedef basic_istringstream<wchar_t> wistringstream;
typedef basic_ostringstream<wchar_t> wostringstream;
typedef basic_stringstream<wchar_t>  wstringstream;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_SSTREAM_INCLUDED


#ifndef _RWSTD_FSTREAM_INCLUDED

_EXPORT
template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_filebuf;

template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_ifstream;

template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_ofstream;

template <class _CharT, class _Traits = char_traits<_CharT> >
class basic_fstream;

typedef basic_filebuf<char>  filebuf;
typedef basic_ifstream<char> ifstream;
typedef basic_ofstream<char> ofstream;
typedef basic_fstream<char>  fstream;

#  ifndef _RWSTD_NO_WCHAR_T

typedef basic_filebuf<wchar_t>  wfilebuf;
typedef basic_ifstream<wchar_t> wifstream;
typedef basic_ofstream<wchar_t> wofstream;
typedef basic_fstream<wchar_t>  wfstream;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_FSTREAM_INCLUDED


#ifndef _RWSTD_RW_IOITER_H_INCLUDED

template <class _CharT, class _Traits = char_traits<_CharT> > 
struct ostreambuf_iterator;

template <class _CharT, class _Traits = char_traits<_CharT> > 
struct istreambuf_iterator;

#endif   // _RWSTD_RW_IOITER_H_INCLUDED


// 27.2, p8
template <class _StateT>
class fpos;

// 27.2, p9 - identical to std::fpos<char_traits<char>::state_type>
//            and std::fpos<char_traits<wchar_t>::state_type>, respectively
typedef fpos<_RWSTD_MBSTATE_T> streampos;
typedef fpos<_RWSTD_MBSTATE_T> wstreampos;

}   // namespace std


#endif   // _RWSTD_IOSFWD_INCLUDED
