-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
fmt::ostream - aggregate buffer instead of inheriting it #3139
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
ef40748
e75f9b8
4e0c866
07ca088
8bf75f9
7fa287d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -379,56 +379,61 @@ struct ostream_params { | |
| # endif | ||
| }; | ||
|
|
||
| class file_buffer final : public detail::buffer<char> { | ||
| file file_; | ||
|
|
||
| FMT_API void grow(size_t) override; | ||
Youw marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| public: | ||
| FMT_API file_buffer(cstring_view path, const detail::ostream_params& params); | ||
Youw marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| FMT_API file_buffer(file_buffer&& other); | ||
| FMT_API ~file_buffer(); | ||
|
|
||
| void flush() { | ||
| if (size() == 0) return; | ||
| file_.write(data(), size() * sizeof(data()[0])); | ||
| clear(); | ||
| } | ||
|
|
||
| void close() { | ||
| flush(); | ||
| file_.close(); | ||
| } | ||
| }; | ||
|
|
||
| FMT_END_DETAIL_NAMESPACE | ||
|
|
||
| // Added {} below to work around default constructor error known to | ||
| // occur in Xcode versions 7.2.1 and 8.2.1. | ||
| constexpr detail::buffer_size buffer_size{}; | ||
|
|
||
| /** A fast output stream which is not thread-safe. */ | ||
| class FMT_API ostream final : private detail::buffer<char> { | ||
| class FMT_API ostream final { | ||
Youw marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| private: | ||
| file file_; | ||
|
|
||
| void grow(size_t) override; | ||
| FMT_MSC_WARNING(suppress : 4251) | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What is this for?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I.e. MSVC doesn't like that |
||
| detail::file_buffer buffer_; | ||
|
|
||
| ostream(cstring_view path, const detail::ostream_params& params) | ||
| : file_(path, params.oflag) { | ||
| set(new char[params.buffer_size], params.buffer_size); | ||
| } | ||
| : buffer_(path, params) {} | ||
|
|
||
| public: | ||
| ostream(ostream&& other) | ||
| : detail::buffer<char>(other.data(), other.size(), other.capacity()), | ||
| file_(std::move(other.file_)) { | ||
| other.clear(); | ||
| other.set(nullptr, 0); | ||
| } | ||
| ~ostream() { | ||
| flush(); | ||
| delete[] data(); | ||
| } | ||
| ostream(ostream&& other) : buffer_(std::move(other.buffer_)) {} | ||
|
|
||
| void flush() { | ||
| if (size() == 0) return; | ||
| file_.write(data(), size()); | ||
| clear(); | ||
| } | ||
| ~ostream(); | ||
|
|
||
| void flush() { buffer_.flush(); } | ||
|
|
||
| template <typename... T> | ||
| friend ostream output_file(cstring_view path, T... params); | ||
|
|
||
| void close() { | ||
| flush(); | ||
| file_.close(); | ||
| } | ||
| void close() { buffer_.close(); } | ||
|
|
||
| /** | ||
| Formats ``args`` according to specifications in ``fmt`` and writes the | ||
| output to the file. | ||
| */ | ||
| template <typename... T> void print(format_string<T...> fmt, T&&... args) { | ||
| vformat_to(detail::buffer_appender<char>(*this), fmt, | ||
| vformat_to(detail::buffer_appender<char>(buffer_), fmt, | ||
| fmt::make_format_args(args...)); | ||
| } | ||
| }; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -366,8 +366,32 @@ long getpagesize() { | |
| # endif | ||
| } | ||
|
|
||
| FMT_API void ostream::grow(size_t) { | ||
| 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; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does it need to be outlined?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. it guess that's my old habit - always anchor class by its d-tor maybe that is not the case for this particular class - but that's the case for polymorphic classes |
||
| #endif // FMT_USE_FCNTL | ||
| FMT_END_NAMESPACE | ||
Uh oh!
There was an error while loading. Please reload this page.