This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/istream.h

567 lines
16 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __ISTREAM_H
#define __ISTREAM_H
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
// -*- C++ -*-
#ifndef __STD_ISTREAM__
#define __STD_ISTREAM__
/***************************************************************************
*
* istream - Declarations for the Standard Library istreams
*
***************************************************************************
*
* Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
*
* This computer software is owned by Rogue Wave Software, Inc. and is
* protected by U.S. copyright laws and other laws and by international
* treaties. This computer software is furnished by Rogue Wave Software,
* Inc. pursuant to a written license agreement and may be used, copied,
* transmitted, and stored only in accordance with the terms of such
* license and with the inclusion of the above copyright notice. This
* computer software or any other copies thereof may not be provided or
* otherwise made available to any other person.
*
* U.S. Government Restricted Rights. This computer software is provided
* with Restricted Rights. Use, duplication, or disclosure by the
* Government is subject to restrictions as set forth in subparagraph (c)
* (1) (ii) of The Rights in Technical Data and Computer Software clause
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
* Commercial Computer Software Restricted Rights at 48 CFR 52.227-19,
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
* Flatiron Parkway, Boulder, Colorado 80301 USA.
*
**************************************************************************/
#include <stdcomp.h>
#include <ios>
#include <ostream>
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
extern istream _RWSTDExport cin;
#ifndef _RWSTD_NO_WIDE_CHAR
extern wistream _RWSTDExport wcin;
#endif
template<class charT, class traits>
class _RWSTDExportTemplate basic_istream : virtual public basic_ios<charT, traits>
{
public:
//
// Types:
//
typedef charT char_type;
typedef _TYPENAME traits::int_type int_type;
typedef _TYPENAME traits::pos_type pos_type;
typedef _TYPENAME traits::off_type off_type;
typedef traits traits_type;
typedef basic_istream<charT, traits> istream_type;
typedef basic_ios<charT, traits> ios_type;
typedef basic_streambuf<charT, traits> streambuf_type;
_EXPLICIT basic_istream(basic_streambuf<charT, traits> *sb);
#if defined ( __SUNPRO_CC )
_EXPLICIT basic_istream(EmptyCtor) : basic_ios<charT, traits>(1) {}
#endif
virtual ~basic_istream();
class sentry
{
public:
inline _EXPLICIT sentry(basic_istream<charT,traits>& stream,
bool noskipws = 0)
: __stream(stream)
{
#ifdef _RWSTD_MULTI_THREAD
if ( stream.rdbuf() )
__guard = new _RWSTDGuard(stream.rdbuf()->buffer_mutex_);
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#endif // _RWSTD_MULTI_THREAD
if(!(stream.good()))
{
stream.setstate(ios_base::failbit);
__ok = false;
}
else
{
if(stream.tie())
stream.tie()->flush();
if(!noskipws && (stream.flags() & ios_base::skipws))
{
int_type c;
#ifndef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
const ctype<charT>& ct = use_facet< ctype<charT> >(stream.getloc());
#else
const ctype<charT>& ct = use_facet(stream.getloc(),(ctype<charT>*)0);
#endif // _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE
while((c = stream.rdbuf()->sgetc()),
( !traits::eq_int_type(c,traits::eof()) && ct.is(ct.space,c) ))
{
stream.rdbuf()->snextc();
}
if( traits::eq_int_type(c,traits::eof()) )
{
stream.setstate(ios_base::eofbit);
}
}
if(!(stream.good()))
{
stream.setstate(ios_base::failbit);
__ok = false;
}
else
__ok =true;
}
#if defined (_RWSTD_MULTI_THREAD) && !defined (_RWSTD_NO_EXCEPTIONS)
} catch(...)
{
if ( __stream.rdbuf() )
delete __guard;
throw;
}
#endif // _RWSTD_MULTI_THREAD etc.
}
~sentry() {
#ifdef _RWSTD_MULTI_THREAD
if ( __stream.rdbuf() )
delete __guard;
#endif // _RWSTD_MULTI_THREAD
}
operator bool () { return __ok; }
private:
basic_istream<charT,traits>& __stream;
bool __ok;
#ifdef _RWSTD_MULTI_THREAD
_RWSTDGuard* __guard;
#endif
};
istream_type& operator>>(istream_type& (*pf)(istream_type&));
istream_type& operator>>(ios_base& (*pf)(ios_base&));
istream_type& operator>>(ios_type& (*pf)(ios_type&));
#ifndef _RWSTD_NO_BOOL
istream_type& operator>>(bool& n);
#endif
istream_type& operator>>(short& n);
istream_type& operator>>(unsigned short& n);
istream_type& operator>>(int& n);
istream_type& operator>>(unsigned int& n);
istream_type& operator>>(long& n);
istream_type& operator>>(unsigned long& n);
istream_type& operator>>(float& f);
istream_type& operator>>(double& f);
istream_type& operator>>(long double& f);
#ifdef _RWSTD_LONG_LONG
istream_type& operator>>(_RWSTD_LONG_LONG& n);
istream_type& operator>>(unsigned _RWSTD_LONG_LONG& n);
#endif
istream_type& operator>>(void*& p);
istream_type& operator>>(streambuf_type& sb);
istream_type& operator>>(streambuf_type *sb);
int_type get()
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
_TYPENAME basic_istream<charT, traits>::sentry ipfx(*this,1);
__chcount = 0;
if(ipfx)
{
int_type c = this->rdbuf()->sbumpc();
if( traits::eq_int_type(c,traits::eof()) )
{
err = ios_base::eofbit | ios_base::failbit;
}
else
{
__chcount = 1;
return c;
}
}
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
if ( err ) this->setstate(err);
return traits::eof();
}
istream_type& get(char_type *s, streamsize n, char_type delim);
istream_type& get(char_type *s, streamsize n)
{ return get(s,n,this->widen('\n')); }
istream_type& get(char_type& c);
istream_type& get(streambuf_type& sb, char_type delim);
istream_type& get(streambuf_type& sb)
{ return get(sb,this->widen('\n')); }
istream_type& getline(char_type *s, streamsize n, char_type delim);
istream_type& getline(char_type *s, streamsize n)
{ return getline(s,n,this->widen('\n')); }
istream_type& ignore(streamsize n = 1, int_type delim = traits::eof());
istream_type& read(char_type *s, streamsize n);
streamsize readsome(char_type *s, streamsize n);
int_type peek();
pos_type tellg();
//
// The seekg functions are inlined for portability
//
istream_type& seekg(pos_type pos)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
if ( this->rdstate() & ios_base::eofbit )
clear( this->rdstate() & ~ios_base::eofbit );
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() ) {
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif // _RWSTD_MULTI_THREAD
// using fail will disable seek when at end of char buffer, bad() would work better
if ( !this->fail() )
this->rdbuf()->pubseekpos(pos, ios_base::in);
#ifdef _RWSTD_MULTI_THREAD
}
#endif // _RWSTD_MULTI_THREAD
#ifndef _RWSTD_NO_EXCEPTIONS
} // end of try block
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
return *this;
}
istream_type& seekg(off_type off, ios_base::seekdir dir)
{
ios_base::iostate err = 0;
#ifndef _RWSTD_NO_EXCEPTIONS
try {
#endif
#ifdef _RWSTD_MULTI_THREAD
if ( this->rdbuf() ) {
_RWSTDGuard guard(this->rdbuf()->buffer_mutex_);
#endif
if ( !this->fail() )
{
this->rdbuf()->pubseekoff(off, dir, ios_base::in);
}
#ifdef _RWSTD_MULTI_THREAD
}
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
}
#endif
#ifndef _RWSTD_NO_EXCEPTIONS
catch(...)
{
bool flag = false;
try {
this->setstate(ios_base::badbit);
}
catch( ios_base::failure ) { flag= true; }
if ( flag ) throw;
}
#endif // _RWSTD_NO_EXCEPTIONS
return *this;
}
int sync();
istream_type& putback(char_type c);
istream_type& unget();
streamsize gcount() const;
#ifdef _RWSTD_MULTI_THREAD
_RWSTDGuard *istream_sentry_guard;
#endif
protected:
basic_istream( );
private:
streamsize __chcount;
};
/*
* Class basic_iostream
*/
template<class charT, class traits>
class _RWSTDExportTemplate basic_iostream : public basic_istream<charT, traits>,
public basic_ostream<charT, traits>
{
public:
_EXPLICIT basic_iostream(basic_streambuf<charT, traits> *sb);
virtual ~basic_iostream();
protected:
_EXPLICIT basic_iostream();
};
//
// istream iterator.
//
#ifdef _RWSTD_NO_UNDEFINED_FRIEND
template <class T, class charT, class traits, class Distance>
class _RWSTDExportTemplate istream_iterator;
template <class T, class charT, class traits, class Distance>
bool operator==
(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y);
#endif
#if !defined(_MSC_VER) || defined(__BORLANDC__)
template <class T, class charT, class traits, class Distance>
#else
template <class T, class charT=char, class traits=char_traits<charT>, class Distance=ptrdiff_t>
#endif
class _RWSTDExportTemplate istream_iterator
: public iterator<input_iterator_tag,T,Distance,const T*, const T&>
{
#ifdef __TURBOC__
friend inline bool (std::operator==) (
const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y);
#else
friend inline bool operator== (
const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y);
#endif
public:
typedef charT char_type;
typedef traits traits_type;
typedef basic_istream<charT,traits> istream_type;
typedef T value_type;
istream_iterator () : stream(&cin), end_marker(false) {}
istream_iterator (basic_istream<charT,traits>& s) : stream(&s) { read(); }
istream_iterator ( const istream_iterator<T,charT,traits,Distance>& x )
: stream(x.stream) , value(x.value) , end_marker(x.end_marker)
{ ; }
const T& operator* () const { return value; }
#ifndef _RWSTD_NO_NONCLASS_ARROW_RETURN
const T* operator->() const { return &value; }
#endif // _RWSTD_NO_NONCLASS_ARROW_RETURN
istream_iterator<T,charT,traits,Distance>& operator++ ()
{
read();
return *this;
}
istream_iterator<T,charT,traits,Distance> operator++ (int)
{
istream_iterator<T,charT,traits,Distance> tmp = *this;
read();
return tmp;
}
protected:
basic_istream<charT,traits>* stream;
T value;
bool end_marker;
void read ()
{
end_marker = (*stream) ? true : false;
if (end_marker) *stream >> value;
end_marker = (*stream) ? true : false;
}
};
template <class T, class charT, class traits, class Distance>
inline bool operator==
(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y)
{
return x.stream == y.stream && x.end_marker == y.end_marker ||
x.end_marker == false && y.end_marker == false;
}
#ifndef _RWSTD_NO_NAMESPACE
template <class T, class charT, class traits, class Distance>
inline bool operator!=
(const istream_iterator<T,charT,traits,Distance>& x,
const istream_iterator<T,charT,traits,Distance>& y)
{
return !(x == y);
}
#endif
template<class charT, class traits>
basic_istream<charT, traits>& _RWSTDExportTemplate
ws(basic_istream<charT, traits>& is);
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
typedef basic_istream<char> istream;
#else
typedef basic_istream<char, char_traits<char> > istream;
#endif
#ifndef _RWSTD_NO_WIDE_CHAR
#ifndef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES
typedef basic_istream<wchar_t> wistream;
#else
typedef basic_istream<wchar_t, char_traits<wchar_t> > wistream;
#endif
#endif
#ifndef _RWSTD_NO_DEFAULT_TEMPLATES
typedef basic_iostream<char> iostream;
#else
typedef basic_iostream<char, char_traits<char> > iostream;
#endif
#ifndef _RWSTD_NO_WIDE_CHAR
#ifndef _RWSTD_NO_DEFAULT_TEMPLATES
typedef basic_iostream<wchar_t> wiostream;
#else
typedef basic_iostream<wchar_t, char_traits<wchar_t> > wiostream;
#endif
#endif
// charT and charT* extractors
template<class charT, class traits>
basic_istream<charT, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<charT, traits>&, charT& );
template<class charT, class traits>
basic_istream<charT, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<charT, traits>&, charT* );
// signed and unsigned extractors
#ifndef _RWSTD_NO_SIGNED_CHAR_IN_STREAMS
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, unsigned char& );
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, signed char& );
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, unsigned char* );
template <class traits>
basic_istream<char, traits>& _RWSTDExportTemplate
operator>> ( basic_istream<char, traits>&, signed char* );
#endif
// String extractor and getline
#ifndef _RWSTD_NO_NAMESPACE
}
namespace __rwstd {
#endif
template <class streamT, class stringT, class traits>
streamT& rw_extract_string(streamT& is, stringT& s, traits);
#ifndef _RWSTD_NO_NAMESPACE
}
namespace std {
#endif
template<class charT, class traits, class Allocator>
inline basic_istream<charT, traits>&
operator>> (basic_istream<charT,traits>& is,
basic_string<charT,traits,Allocator>& s)
{
return __RWSTD::rw_extract_string(is,s,traits());
}
template<class charT, class traits, class Allocator>
basic_istream<charT, traits>& _RWSTDExportTemplate
getline( basic_istream<charT, traits>&,
basic_string<charT, traits, Allocator>&,
charT delim );
template<class charT, class traits, class Allocator>
inline basic_istream<charT, traits>&
getline( basic_istream<charT, traits>& is,
basic_string<charT, traits, Allocator>& str )
{ return getline(is,str,is.widen('\n')); }
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#ifdef _RWSTD_COMPILE_INSTANTIATE
#include <istream.cc>
#endif
#endif // __STD__ISTREAM__
#ifndef __USING_STD_NAMES__
using namespace std;
#endif
#pragma option pop
#endif /* __ISTREAM_H */