From: Joel Rosdahl Date: Thu, 30 Dec 2021 12:29:18 +0000 (+0100) Subject: enhance: Add File::File(FILE*) constructor X-Git-Tag: v4.6~31 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a2cccb460207312b9b905aace73637bc3b6841aa;p=thirdparty%2Fccache.git enhance: Add File::File(FILE*) constructor --- diff --git a/src/File.hpp b/src/File.hpp index fe3206f48..eea2c09c6 100644 --- a/src/File.hpp +++ b/src/File.hpp @@ -27,6 +27,7 @@ class File : public NonCopyable { public: File() = default; + File(FILE* file); File(const std::string& path, const char* mode); File(File&& other) noexcept; ~File(); @@ -42,16 +43,26 @@ public: private: FILE* m_file = nullptr; + bool m_owned = false; }; +inline File::File(FILE* const file) +{ + m_file = file; + m_owned = false; +} + inline File::File(const std::string& path, const char* mode) { open(path, mode); } -inline File::File(File&& other) noexcept : m_file(other.m_file) +inline File::File(File&& other) noexcept + : m_file(other.m_file), + m_owned(other.m_owned) { other.m_file = nullptr; + other.m_owned = false; } inline File::~File() @@ -63,7 +74,9 @@ inline File& File::operator=(File&& other) noexcept { m_file = other.m_file; + m_owned = other.m_owned; other.m_file = nullptr; + other.m_owned = false; return *this; } @@ -72,15 +85,17 @@ File::open(const std::string& path, const char* mode) { close(); m_file = fopen(path.c_str(), mode); + m_owned = true; } inline void File::close() { - if (m_file) { + if (m_file && m_owned) { fclose(m_file); m_file = nullptr; } + m_owned = false; } inline File::operator bool() const