mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 18:40:05 +00:00
96 lines
2.2 KiB
C++
96 lines
2.2 KiB
C++
#include <scwx/qt/util/q_file_input_stream.hpp>
|
|
#include <scwx/qt/util/q_file_buffer.hpp>
|
|
|
|
namespace scwx
|
|
{
|
|
namespace qt
|
|
{
|
|
namespace util
|
|
{
|
|
|
|
static const std::string logPrefix_ = "scwx::qt::util::q_file_input_stream";
|
|
|
|
// Adapted from Microsoft ifstream reference implementation
|
|
// Copyright (c) Microsoft Corporation.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
class QFileInputStream::Impl
|
|
{
|
|
public:
|
|
explicit Impl() : buffer_ {} {};
|
|
explicit Impl(const std::string& filename, std::ios_base::openmode mode) :
|
|
buffer_ {filename, mode} {};
|
|
~Impl() = default;
|
|
|
|
QFileBuffer buffer_;
|
|
};
|
|
|
|
QFileInputStream::QFileInputStream() :
|
|
std::istream(nullptr), p(std::make_unique<Impl>())
|
|
{
|
|
std::basic_ios<char_type, traits_type>::rdbuf(&p->buffer_);
|
|
}
|
|
|
|
QFileInputStream::QFileInputStream(const std::string& filename,
|
|
std::ios_base::openmode mode) :
|
|
std::istream(nullptr),
|
|
p(std::make_unique<Impl>(filename, mode | std::ios_base::in))
|
|
{
|
|
std::basic_ios<char_type, traits_type>::rdbuf(&p->buffer_);
|
|
if (!p->buffer_.is_open())
|
|
{
|
|
setstate(std::ios_base::failbit);
|
|
}
|
|
}
|
|
|
|
QFileInputStream::~QFileInputStream() = default;
|
|
|
|
QFileInputStream::QFileInputStream(QFileInputStream&& other) noexcept :
|
|
std::istream(nullptr), p(std::make_unique<Impl>())
|
|
{
|
|
swap(other);
|
|
};
|
|
QFileInputStream&
|
|
QFileInputStream::operator=(QFileInputStream&&) noexcept = default;
|
|
|
|
void QFileInputStream::swap(QFileInputStream& other)
|
|
{
|
|
// Swap the base class and managed implementation pointer
|
|
std::istream::swap(other);
|
|
p.swap(other.p);
|
|
}
|
|
|
|
bool QFileInputStream::is_open() const
|
|
{
|
|
return p->buffer_.is_open();
|
|
}
|
|
|
|
void QFileInputStream::open(const std::string& filename,
|
|
std::ios_base::openmode mode)
|
|
{
|
|
if (p->buffer_.open(filename, mode | std::ios_base::in) == nullptr)
|
|
{
|
|
setstate(std::ios_base::failbit);
|
|
}
|
|
else
|
|
{
|
|
clear();
|
|
}
|
|
}
|
|
|
|
void QFileInputStream::close()
|
|
{
|
|
if (p->buffer_.close() == nullptr)
|
|
{
|
|
setstate(std::ios_base::failbit);
|
|
}
|
|
}
|
|
|
|
QFileBuffer* QFileInputStream::rdbuf() const
|
|
{
|
|
return &p->buffer_;
|
|
}
|
|
|
|
} // namespace util
|
|
} // namespace qt
|
|
} // namespace scwx
|