Files

122 lines
3.8 KiB
Plaintext

#pragma GCC system_header
#ifndef _LIBCXX_IOS
#define _LIBCXX_IOS
#include <__config>
#include <iosfwd>
_LIBCXX_BEGIN_NAMESPACE_STD
typedef size_t streamsize;
class ios_base {
public:
typedef uint32_t openmode;
static constexpr openmode app = 0x1;
static constexpr openmode binary = 0x2;
static constexpr openmode in = 0x4;
static constexpr openmode out = 0x8;
static constexpr openmode trunc = 0x10;
static constexpr openmode ate = 0x20;
typedef uint32_t fmtflags;
static constexpr fmtflags dec = 0x1;
static constexpr fmtflags oct = 0x2;
static constexpr fmtflags hex = 0x4;
static constexpr fmtflags basefield = dec | oct | hex;
static constexpr fmtflags left = 0x8;
static constexpr fmtflags right = 0x10;
static constexpr fmtflags internal = 0x20;
static constexpr fmtflags adjustfield = left | right | internal;
static constexpr fmtflags scientific = 0x40;
static constexpr fmtflags fixed = 0x80;
static constexpr fmtflags floatfield = scientific | fixed;
static constexpr fmtflags boolalpha = 0x100;
static constexpr fmtflags showbase = 0x200;
static constexpr fmtflags showpoint = 0x400;
static constexpr fmtflags showpos = 0x800;
static constexpr fmtflags skipws = 0x1000;
static constexpr fmtflags unitbuf = 0x2000;
static constexpr fmtflags uppercase = 0x4000;
typedef uint32_t iostate;
static constexpr iostate goodbit = 0x0;
static constexpr iostate badbit = 0x1;
static constexpr iostate failbit = 0x2;
static constexpr iostate eofbit = 0x4;
typedef uint32_t seekdir;
static constexpr seekdir beg = 0x1;
static constexpr seekdir end = 0x2;
static constexpr seekdir cur = 0x4;
ios_base() = default;
virtual ~ios_base() = default;
fmtflags flags() const { return m_fl; }
fmtflags flags(fmtflags flags) { return m_fl = flags; }
fmtflags setf(fmtflags flags) { return m_fl |= flags; }
fmtflags setf(fmtflags flags, fmtflags mask) { return m_fl = (m_fl & ~mask) | (flags & mask); }
void unsetf(fmtflags flags) { m_fl = (m_fl & ~flags); }
streamsize precision() const { return m_precision; }
streamsize precision(streamsize n_p) { return m_precision = n_p; }
streamsize width() const { return m_width; }
streamsize width(streamsize n_w) { return m_width = n_w; }
bool good() const { return rdstate() == goodbit; }
bool eof() const { return (m_rdstate & eofbit) != 0; }
bool fail() const { return (m_rdstate & failbit) != 0; }
bool bad() const { return (m_rdstate & badbit) != 0; }
bool operator!() const { return fail(); }
explicit operator bool() const { return !fail(); }
iostate rdstate() const { return m_rdstate; }
void setstate(iostate state) { m_rdstate = state; }
void clear(iostate state = goodbit) { m_rdstate = state; }
// TODO: Support locales
private:
fmtflags m_fl { 0 };
iostate m_rdstate { 0 };
iostate m_state { 0 };
streamsize m_precision { 0 };
streamsize m_width { 0 };
};
template <class CharT, class Traits>
class basic_ios : public ios_base {
public:
using char_type = CharT;
using traits_type = Traits;
using int_type = typename traits_type::int_type;
using pos_type = typename traits_type::pos_type;
using off_type = typename traits_type::off_type;
explicit basic_ios(basic_streambuf<char_type, traits_type>* rdbuf)
: ios_base()
, m_rdbuf(rdbuf)
{
}
virtual ~basic_ios() = default;
basic_streambuf<CharT, Traits>* rdbuf() const { return m_rdbuf; }
basic_streambuf<CharT, Traits>* rdbuf(basic_streambuf<CharT, Traits>* sb) { return m_rdbuf = sb; }
// TODO: Add more API to match C++20 standard.
protected:
basic_ios() = default;
private:
basic_streambuf<char_type, traits_type>* m_rdbuf { nullptr };
};
_LIBCXX_END_NAMESPACE_STD
#endif // _LIBCXX_IOS