add finalizing_ostream
This commit is contained in:
parent
1c92a7c9e7
commit
9279b8385e
47
src/io/finalizing_ostream.hpp
Normal file
47
src/io/finalizing_ostream.hpp
Normal file
@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <ostream>
|
||||
#include <functional>
|
||||
|
||||
class finalizing_ostream final : public std::ostream {
|
||||
public:
|
||||
finalizing_ostream(
|
||||
std::unique_ptr<std::ostream> inner,
|
||||
std::function<void(std::unique_ptr<std::ostream>)> on_destruction
|
||||
)
|
||||
: std::ostream(inner->rdbuf()),
|
||||
innerStream(std::move(inner)),
|
||||
onDestruction(on_destruction) {
|
||||
}
|
||||
|
||||
finalizing_ostream(const finalizing_ostream&) = delete;
|
||||
finalizing_ostream& operator=(const finalizing_ostream&) = delete;
|
||||
|
||||
finalizing_ostream(finalizing_ostream&& other) noexcept
|
||||
: std::ostream(std::move(other)),
|
||||
innerStream(std::move(other.innerStream)),
|
||||
onDestruction(std::move(other.onDestruction)) {
|
||||
other.onDestruction = nullptr;
|
||||
}
|
||||
|
||||
finalizing_ostream& operator=(finalizing_ostream&& other) noexcept {
|
||||
if (this != &other) {
|
||||
std::ostream::operator=(std::move(other));
|
||||
innerStream = std::move(other.innerStream);
|
||||
onDestruction = std::move(other.onDestruction);
|
||||
other.onDestruction = nullptr;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
~finalizing_ostream() {
|
||||
if (onDestruction) {
|
||||
onDestruction(std::move(innerStream));
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<std::ostream> innerStream;
|
||||
std::function<void(std::unique_ptr<std::ostream>)> onDestruction;
|
||||
};
|
||||
Loading…
x
Reference in New Issue
Block a user