From 4c3d191de8b910f97cc3b30f2a432cdb5a0b2609 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Thu, 22 Dec 2011 21:11:46 +0000 Subject: [PATCH] Significantly simplify agi::Options::PutOption Originally committed to SVN as r6014. --- aegisub/libaegisub/common/option.cpp | 27 +++++++------------ aegisub/libaegisub/common/option_visit.h | 24 ----------------- .../libaegisub/include/libaegisub/option.h | 4 +-- 3 files changed, 11 insertions(+), 44 deletions(-) diff --git a/aegisub/libaegisub/common/option.cpp b/aegisub/libaegisub/common/option.cpp index 99741c3ea..342fca32e 100644 --- a/aegisub/libaegisub/common/option.cpp +++ b/aegisub/libaegisub/common/option.cpp @@ -203,25 +203,18 @@ void Options::Flush() { json::Writer::Write(obj_out, file.Get()); } - -bool Options::PutOption(json::Object &obj, const std::string &path, const json::UnknownElement &value) { - // Having a '/' denotes it is a leaf. - if (path.find('/') == std::string::npos) { +void Options::PutOption(json::Object &obj, const std::string &path, const json::UnknownElement &value) { + std::string::size_type pos = path.find('/'); + // Not having a '/' denotes it is a leaf. + if (pos == std::string::npos) { assert(obj.find(path) == obj.end()); obj[path] = value; - return true; - } else { - std::string thispart = path.substr(0, path.find("/")); - std::string restpart = path.substr(path.find("/")+1, path.size()); - json::Object::iterator pos = obj.find(thispart); - - // New key, make object. - if (pos == obj.end()) - pos = obj.insert(make_pair(thispart, json::Object())).first; - - PutOptionVisitor visitor(restpart, value); - pos->second.Accept(visitor); - return visitor.result; + } + else { + PutOption( + obj[path.substr(0, pos)], + path.substr(pos + 1), + value); } } diff --git a/aegisub/libaegisub/common/option_visit.h b/aegisub/libaegisub/common/option_visit.h index 33b52f3dd..67e92a4b8 100644 --- a/aegisub/libaegisub/common/option_visit.h +++ b/aegisub/libaegisub/common/option_visit.h @@ -48,28 +48,4 @@ public: void Visit(const json::Null& null); }; - -class PutOptionVisitor : public json::Visitor { -public: - bool result; - const std::string &path; - const json::UnknownElement &value; - - PutOptionVisitor(const std::string &path, const json::UnknownElement &value) - : result(false), path(path), value(value) - {} - - // all of these are a fail - virtual void Visit(json::Array& array) { } - virtual void Visit(json::Number& number) { } - virtual void Visit(json::String& string) { } - virtual void Visit(json::Boolean& boolean) { } - virtual void Visit(json::Null& null) { } - - // this one is the win - virtual void Visit(json::Object& object) { - result = Options::PutOption(object, path, value); - } -}; - } // namespace agi diff --git a/aegisub/libaegisub/include/libaegisub/option.h b/aegisub/libaegisub/include/libaegisub/option.h index 6fded30d3..1ef799bd4 100644 --- a/aegisub/libaegisub/include/libaegisub/option.h +++ b/aegisub/libaegisub/include/libaegisub/option.h @@ -52,8 +52,6 @@ public: }; class Options { - friend class PutOptionVisitor; - public: /// Options class settings. enum OptionSetting { @@ -89,7 +87,7 @@ private: /// @param[out] obj Parent object /// @param[in] path Path option should be stored in. /// @param[in] value Value to write. - static bool PutOption(::json::Object &obj, const std::string &path, const ::json::UnknownElement &value); + static void PutOption(::json::Object &obj, const std::string &path, const ::json::UnknownElement &value); public: /// @brief Constructor