From f051e59a617bc97657f0cc0cabc0ec5e3b13d833 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Fri, 7 Jun 2013 20:18:00 -0700 Subject: [PATCH] Return a unique_ptr from agi::io::Open --- aegisub/libaegisub/common/io.cpp | 9 ++++----- aegisub/libaegisub/common/json.cpp | 11 +++++------ aegisub/libaegisub/common/vfr.cpp | 8 ++++---- aegisub/libaegisub/include/libaegisub/io.h | 3 ++- aegisub/libaegisub/include/libaegisub/json.h | 6 ++++-- aegisub/libaegisub/include/libaegisub/util.h | 10 ++++++++++ aegisub/src/toolbar.cpp | 3 ++- 7 files changed, 31 insertions(+), 19 deletions(-) diff --git a/aegisub/libaegisub/common/io.cpp b/aegisub/libaegisub/common/io.cpp index 798b65923..4a6ac49b2 100644 --- a/aegisub/libaegisub/common/io.cpp +++ b/aegisub/libaegisub/common/io.cpp @@ -30,16 +30,15 @@ namespace agi { namespace io { -std::ifstream* Open(fs::path const& file, bool binary) { +std::unique_ptr Open(fs::path const& file, bool binary) { LOG_D("agi/io/open/file") << file; acs::CheckFileRead(file); - auto stream = new boost::filesystem::ifstream(file, (binary ? std::ios::binary : std::ios::in)); + std::unique_ptr stream( + new boost::filesystem::ifstream(file, (binary ? std::ios::binary : std::ios::in))); - if (stream->fail()) { - delete stream; + if (stream->fail()) throw IOFatal("Unknown fatal error as occurred"); - } return stream; } diff --git a/aegisub/libaegisub/common/json.cpp b/aegisub/libaegisub/common/json.cpp index dfa40e7d5..5834faad8 100644 --- a/aegisub/libaegisub/common/json.cpp +++ b/aegisub/libaegisub/common/json.cpp @@ -27,14 +27,13 @@ #include "libaegisub/fs.h" #include "libaegisub/io.h" #include "libaegisub/log.h" +#include "libaegisub/util.h" namespace agi { namespace json_util { -json::UnknownElement parse(std::istream *stream) { +json::UnknownElement parse(std::unique_ptr stream) { try { - std::unique_ptr stream_deleter(stream); - json::UnknownElement root; json::Reader::Read(root, *stream); return root; @@ -57,15 +56,15 @@ json::UnknownElement file(agi::fs::path const& file, const std::string &default_ } catch (fs::FileNotFound const&) { // Not an error - return parse(new std::istringstream(default_config)); + return parse(util::make_unique(default_config)); } catch (json::Exception&) { // Already logged in parse - return parse(new std::istringstream(default_config)); + return parse(util::make_unique(default_config)); } catch (agi::Exception& e) { LOG_E("json/file") << "Unexpected error when reading config file " << file << ": " << e.GetMessage(); - return parse(new std::istringstream(default_config)); + return parse(util::make_unique(default_config)); } } diff --git a/aegisub/libaegisub/common/vfr.cpp b/aegisub/libaegisub/common/vfr.cpp index f4eb39206..8cfcfafbe 100644 --- a/aegisub/libaegisub/common/vfr.cpp +++ b/aegisub/libaegisub/common/vfr.cpp @@ -198,9 +198,9 @@ Framerate::Framerate(fs::path const& filename) : denominator(default_denominator) , numerator(0) { - scoped_ptr file(agi::io::Open(filename)); - std::string encoding = agi::charset::Detect(filename); - std::string line = *line_iterator(*file, encoding); + auto file = agi::io::Open(filename); + auto encoding = agi::charset::Detect(filename); + auto line = *line_iterator(*file, encoding); if (line == "# timecode format v2") { copy(line_iterator(*file, encoding), line_iterator(), back_inserter(timecodes)); SetFromTimecodes(); @@ -218,7 +218,7 @@ Framerate::Framerate(fs::path const& filename) void Framerate::Save(fs::path const& filename, int length) const { agi::io::Save file(filename); - std::ofstream &out = file.Get(); + auto &out = file.Get(); out << "# timecode format v2\n"; boost::copy(timecodes, std::ostream_iterator(out, "\n")); diff --git a/aegisub/libaegisub/include/libaegisub/io.h b/aegisub/libaegisub/include/libaegisub/io.h index b23d73a29..856c386e0 100644 --- a/aegisub/libaegisub/include/libaegisub/io.h +++ b/aegisub/libaegisub/include/libaegisub/io.h @@ -21,6 +21,7 @@ #include #include +#include namespace agi { namespace io { @@ -28,7 +29,7 @@ namespace agi { DEFINE_BASE_EXCEPTION_NOINNER(IOError, Exception) DEFINE_SIMPLE_EXCEPTION_NOINNER(IOFatal, IOError, "io/fatal") -std::ifstream* Open(fs::path const& file, bool binary = false); +std::unique_ptr Open(fs::path const& file, bool binary = false); class Save { std::ofstream *fp; diff --git a/aegisub/libaegisub/include/libaegisub/json.h b/aegisub/libaegisub/include/libaegisub/json.h index e132120fb..0fb67ecfe 100644 --- a/aegisub/libaegisub/include/libaegisub/json.h +++ b/aegisub/libaegisub/include/libaegisub/json.h @@ -20,13 +20,15 @@ #include #include +#include + namespace agi { namespace json_util { /// Parse a JSON stream. -/// @param stream JSON stream, this is deleted internally. +/// @param stream JSON stream to parse /// @return json::UnknownElement -json::UnknownElement parse(std::istream *stream); +json::UnknownElement parse(std::unique_ptr stream); /// Parse a JSON file. /// @param file Path JSON to file diff --git a/aegisub/libaegisub/include/libaegisub/util.h b/aegisub/libaegisub/include/libaegisub/util.h index 95cbac266..1f6dfc5ce 100644 --- a/aegisub/libaegisub/include/libaegisub/util.h +++ b/aegisub/libaegisub/include/libaegisub/util.h @@ -69,5 +69,15 @@ namespace agi { /// @param name New name for the thread void SetThreadName(const char *name); + template + std::unique_ptr make_unique() { + return std::unique_ptr(new T); + } + + template + std::unique_ptr make_unique(A1&& a1) { + return std::unique_ptr(new T(std::forward(a1))); + } + } // namespace util } // namespace agi diff --git a/aegisub/src/toolbar.cpp b/aegisub/src/toolbar.cpp index 40b772888..4ba5185e8 100644 --- a/aegisub/src/toolbar.cpp +++ b/aegisub/src/toolbar.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -43,7 +44,7 @@ namespace { json::Object const& get_root() { static json::Object root; if (root.empty()) - root = agi::json_util::parse(new std::istringstream(GET_DEFAULT_CONFIG(default_toolbar))); + root = agi::json_util::parse(agi::util::make_unique(GET_DEFAULT_CONFIG(default_toolbar))); return root; }