non-template solution attempt
This commit is contained in:
parent
4e0c8667d3
commit
07ca088035
@ -379,35 +379,20 @@ struct ostream_params {
|
|||||||
# endif
|
# endif
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Char> class file_buffer final : public detail::buffer<Char> {
|
class file_buffer final : public detail::buffer<char> {
|
||||||
file file_;
|
file file_;
|
||||||
|
|
||||||
void grow(size_t) override {
|
FMT_API void grow(size_t) override;
|
||||||
if (this->size() == this->capacity()) flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
file_buffer(cstring_view path, const detail::ostream_params& params)
|
FMT_API file_buffer(cstring_view path, const detail::ostream_params& params);
|
||||||
: file_(path, params.oflag) {
|
FMT_API file_buffer(file_buffer&& other);
|
||||||
detail::buffer<Char>::set(new Char[params.buffer_size], params.buffer_size);
|
FMT_API ~file_buffer();
|
||||||
}
|
|
||||||
file_buffer(file_buffer&& other)
|
|
||||||
: detail::buffer<Char>(other.data(), other.size(), other.capacity()),
|
|
||||||
file_(std::move(other.file_)) {
|
|
||||||
other.clear();
|
|
||||||
other.set(nullptr, 0);
|
|
||||||
}
|
|
||||||
~file_buffer() {
|
|
||||||
flush();
|
|
||||||
delete[] detail::buffer<Char>::data();
|
|
||||||
}
|
|
||||||
|
|
||||||
void flush() {
|
void flush() {
|
||||||
if (detail::buffer<Char>::size() == 0) return;
|
if (size() == 0) return;
|
||||||
file_.write(
|
file_.write(data(), size() * sizeof(data()[0]));
|
||||||
detail::buffer<Char>::data(),
|
clear();
|
||||||
detail::buffer<Char>::size() * sizeof(detail::buffer<Char>::data()[0]));
|
|
||||||
detail::buffer<Char>::clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void close() {
|
void close() {
|
||||||
@ -426,7 +411,7 @@ constexpr detail::buffer_size buffer_size{};
|
|||||||
class FMT_API ostream final {
|
class FMT_API ostream final {
|
||||||
private:
|
private:
|
||||||
FMT_MSC_WARNING(suppress : 4251)
|
FMT_MSC_WARNING(suppress : 4251)
|
||||||
detail::file_buffer<char> buffer_;
|
detail::file_buffer buffer_;
|
||||||
|
|
||||||
ostream(cstring_view path, const detail::ostream_params& params)
|
ostream(cstring_view path, const detail::ostream_params& params)
|
||||||
: buffer_(path, params) {}
|
: buffer_(path, params) {}
|
||||||
|
|||||||
26
src/os.cc
26
src/os.cc
@ -366,6 +366,32 @@ long getpagesize() {
|
|||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FMT_BEGIN_DETAIL_NAMESPACE
|
||||||
|
|
||||||
|
void file_buffer::grow(size_t) {
|
||||||
|
if (this->size() == this->capacity()) flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
file_buffer::file_buffer(cstring_view path,
|
||||||
|
const detail::ostream_params& params)
|
||||||
|
: file_(path, params.oflag) {
|
||||||
|
set(new char[params.buffer_size], params.buffer_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
file_buffer::file_buffer(file_buffer&& other)
|
||||||
|
: detail::buffer<char>(other.data(), other.size(), other.capacity()),
|
||||||
|
file_(std::move(other.file_)) {
|
||||||
|
other.clear();
|
||||||
|
other.set(nullptr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
file_buffer::~file_buffer() {
|
||||||
|
flush();
|
||||||
|
delete[] data();
|
||||||
|
}
|
||||||
|
|
||||||
|
FMT_END_DETAIL_NAMESPACE
|
||||||
|
|
||||||
ostream::~ostream() = default;
|
ostream::~ostream() = default;
|
||||||
#endif // FMT_USE_FCNTL
|
#endif // FMT_USE_FCNTL
|
||||||
FMT_END_NAMESPACE
|
FMT_END_NAMESPACE
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user