mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 08:10:05 +00:00
Initial QFileInputStream implementation
This commit is contained in:
parent
08965aa7f3
commit
ad6eb61898
5 changed files with 218 additions and 5 deletions
|
|
@ -161,13 +161,15 @@ set(HDR_UTIL source/scwx/qt/util/color.hpp
|
||||||
source/scwx/qt/util/json.hpp
|
source/scwx/qt/util/json.hpp
|
||||||
source/scwx/qt/util/streams.hpp
|
source/scwx/qt/util/streams.hpp
|
||||||
source/scwx/qt/util/texture_atlas.hpp
|
source/scwx/qt/util/texture_atlas.hpp
|
||||||
source/scwx/qt/util/q_file_buffer.hpp)
|
source/scwx/qt/util/q_file_buffer.hpp
|
||||||
|
source/scwx/qt/util/q_file_input_stream.hpp)
|
||||||
set(SRC_UTIL source/scwx/qt/util/color.cpp
|
set(SRC_UTIL source/scwx/qt/util/color.cpp
|
||||||
source/scwx/qt/util/font.cpp
|
source/scwx/qt/util/font.cpp
|
||||||
source/scwx/qt/util/font_buffer.cpp
|
source/scwx/qt/util/font_buffer.cpp
|
||||||
source/scwx/qt/util/json.cpp
|
source/scwx/qt/util/json.cpp
|
||||||
source/scwx/qt/util/texture_atlas.cpp
|
source/scwx/qt/util/texture_atlas.cpp
|
||||||
source/scwx/qt/util/q_file_buffer.cpp)
|
source/scwx/qt/util/q_file_buffer.cpp
|
||||||
|
source/scwx/qt/util/q_file_input_stream.cpp)
|
||||||
set(HDR_VIEW source/scwx/qt/view/level2_product_view.hpp
|
set(HDR_VIEW source/scwx/qt/view/level2_product_view.hpp
|
||||||
source/scwx/qt/view/level3_product_view.hpp
|
source/scwx/qt/view/level3_product_view.hpp
|
||||||
source/scwx/qt/view/level3_radial_view.hpp
|
source/scwx/qt/view/level3_radial_view.hpp
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,13 @@ QFileBuffer::~QFileBuffer() = default;
|
||||||
QFileBuffer::QFileBuffer(QFileBuffer&&) noexcept = default;
|
QFileBuffer::QFileBuffer(QFileBuffer&&) noexcept = default;
|
||||||
QFileBuffer& QFileBuffer::operator=(QFileBuffer&&) noexcept = default;
|
QFileBuffer& QFileBuffer::operator=(QFileBuffer&&) noexcept = default;
|
||||||
|
|
||||||
|
void QFileBuffer::swap(QFileBuffer& other)
|
||||||
|
{
|
||||||
|
// Swap the base class and managed implementation pointer
|
||||||
|
std::streambuf::swap(other);
|
||||||
|
p.swap(other.p);
|
||||||
|
}
|
||||||
|
|
||||||
bool QFileBuffer::is_open() const
|
bool QFileBuffer::is_open() const
|
||||||
{
|
{
|
||||||
return p->file_.isOpen();
|
return p->file_.isOpen();
|
||||||
|
|
@ -147,7 +154,7 @@ QFileBuffer::int_type QFileBuffer::pbackfail(int_type c)
|
||||||
traits_type::eq_int_type(traits_type::to_int_type(gptr()[-1]), c)))
|
traits_type::eq_int_type(traits_type::to_int_type(gptr()[-1]), c)))
|
||||||
{
|
{
|
||||||
// Just back up position
|
// Just back up position
|
||||||
gbump(static_cast<int>(sizeof(char_type)) * -1);
|
gbump(-1);
|
||||||
return traits_type::not_eof(c);
|
return traits_type::not_eof(c);
|
||||||
}
|
}
|
||||||
else if (!is_open() || traits_type::eq_int_type(traits_type::eof(), c))
|
else if (!is_open() || traits_type::eq_int_type(traits_type::eof(), c))
|
||||||
|
|
@ -274,7 +281,7 @@ QFileBuffer::int_type QFileBuffer::uflow()
|
||||||
{
|
{
|
||||||
// Return buffered
|
// Return buffered
|
||||||
int_type c = traits_type::to_int_type(*gptr());
|
int_type c = traits_type::to_int_type(*gptr());
|
||||||
gbump(sizeof(char_type));
|
gbump(1);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ public:
|
||||||
explicit QFileBuffer();
|
explicit QFileBuffer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new QFileBuffer object, then associated the object with a
|
* Constructs a new QFileBuffer object, then associates the object with a
|
||||||
* file by calling open(filename, mode). If the open call is successful,
|
* file by calling open(filename, mode). If the open call is successful,
|
||||||
* is_open() returns true.
|
* is_open() returns true.
|
||||||
*/
|
*/
|
||||||
|
|
@ -43,6 +43,13 @@ public:
|
||||||
QFileBuffer(QFileBuffer&&) noexcept;
|
QFileBuffer(QFileBuffer&&) noexcept;
|
||||||
QFileBuffer& operator=(QFileBuffer&&) noexcept;
|
QFileBuffer& operator=(QFileBuffer&&) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Swaps two QFileBuffer objects
|
||||||
|
*
|
||||||
|
* Exchanges the contents of the QFile buffer with those of the other.
|
||||||
|
*/
|
||||||
|
void swap(QFileBuffer& other);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks if the associated file is open
|
* @brief Checks if the associated file is open
|
||||||
*
|
*
|
||||||
|
|
|
||||||
96
scwx-qt/source/scwx/qt/util/q_file_input_stream.cpp
Normal file
96
scwx-qt/source/scwx/qt/util/q_file_input_stream.cpp
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
#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
|
||||||
101
scwx-qt/source/scwx/qt/util/q_file_input_stream.hpp
Normal file
101
scwx-qt/source/scwx/qt/util/q_file_input_stream.hpp
Normal file
|
|
@ -0,0 +1,101 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <istream>
|
||||||
|
|
||||||
|
namespace scwx
|
||||||
|
{
|
||||||
|
namespace qt
|
||||||
|
{
|
||||||
|
namespace util
|
||||||
|
{
|
||||||
|
|
||||||
|
class QFileBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The QFileInputStream class is a std::istream interface to a QFile, allowing
|
||||||
|
* use with C++ stream-based I/O.
|
||||||
|
*
|
||||||
|
* Documentation for functions derived from
|
||||||
|
* https://en.cppreference.com/ SPDX-License-Identifier: CC BY-SA 3.0
|
||||||
|
*/
|
||||||
|
class QFileInputStream : public std::istream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructs a new QFileInputStream object. The created object is not
|
||||||
|
* associated with a file: default-constructs the QFileBuffer and constructs
|
||||||
|
* the base with the pointer to this default-constructed QFileBuffer member.
|
||||||
|
*/
|
||||||
|
explicit QFileInputStream();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new QFileInputStream object, then associates the object with
|
||||||
|
* a file by calling rdbuf()->open(filename, mode | std::ios_base::in). If
|
||||||
|
* the open() call returns a null pointer, sets setstate(failbit).
|
||||||
|
*/
|
||||||
|
explicit QFileInputStream(const std::string& filename,
|
||||||
|
std::ios_base::openmode mode = std::ios_base::in);
|
||||||
|
~QFileInputStream();
|
||||||
|
|
||||||
|
QFileInputStream(const QFileInputStream&) = delete;
|
||||||
|
QFileInputStream& operator=(const QFileInputStream&) = delete;
|
||||||
|
|
||||||
|
QFileInputStream(QFileInputStream&&) noexcept;
|
||||||
|
QFileInputStream& operator=(QFileInputStream&&) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Swaps two QFileInputStream objects
|
||||||
|
*
|
||||||
|
* Exchanges the contents of the QFile input stream with those of the other.
|
||||||
|
*/
|
||||||
|
void swap(QFileInputStream& other);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks if the stream has an associated file
|
||||||
|
*
|
||||||
|
* Checks if the file stream has an associated file. Effectively calls
|
||||||
|
* rdbuf()->is_open().
|
||||||
|
*
|
||||||
|
* @return true if the associated file is open, false otherwise
|
||||||
|
*/
|
||||||
|
bool is_open() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Opens a file and associates it with the stream
|
||||||
|
*
|
||||||
|
* Opens and associates the file with name filename with the file stream.
|
||||||
|
* Effectively calls rdbuf()->open(filename, mode | ios_base::in). Calls
|
||||||
|
* setstate(failbit) on failure.
|
||||||
|
*
|
||||||
|
* @param filename The file name to open
|
||||||
|
* @param openmode The file opening mode, a binary OR of the std::ios_base
|
||||||
|
* modes
|
||||||
|
*/
|
||||||
|
void open(const std::string& filename,
|
||||||
|
std::ios_base::openmode mode = std::ios_base::in);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Close the associated file
|
||||||
|
*
|
||||||
|
* Closes the associated file. Effectively calls rdbuf()->close(). If an
|
||||||
|
* error occurs during operation, setstate(failbit) is called.
|
||||||
|
*/
|
||||||
|
void close();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the underlying raw file device object
|
||||||
|
*
|
||||||
|
* Returns a pointer to the underlying raw file device object.
|
||||||
|
*
|
||||||
|
* @return Pointer to the underlying raw file device
|
||||||
|
*/
|
||||||
|
QFileBuffer* rdbuf() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class Impl;
|
||||||
|
std::unique_ptr<Impl> p;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace util
|
||||||
|
} // namespace qt
|
||||||
|
} // namespace scwx
|
||||||
Loading…
Add table
Add a link
Reference in a new issue