From 64f51c917f809a195839d87d1068c341be46329b Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Sun, 9 Mar 2014 14:17:56 -0700 Subject: [PATCH] Kill the awkward automatic subtitle format (de)registration --- aegisub/src/main.cpp | 1 - aegisub/src/subtitle_format.cpp | 43 +++++++++++++++------------------ aegisub/src/subtitle_format.h | 7 ------ 3 files changed, 19 insertions(+), 32 deletions(-) diff --git a/aegisub/src/main.cpp b/aegisub/src/main.cpp index 03dc418b2..6dc63d506 100644 --- a/aegisub/src/main.cpp +++ b/aegisub/src/main.cpp @@ -291,7 +291,6 @@ int AegisubApp::OnExit() { wxTheClipboard->Close(); } - SubtitleFormat::DestroyFormats(); delete config::opt; delete config::mru; hotkey::clear(); diff --git a/aegisub/src/subtitle_format.cpp b/aegisub/src/subtitle_format.cpp index 36355dc69..286249c2d 100644 --- a/aegisub/src/subtitle_format.cpp +++ b/aegisub/src/subtitle_format.cpp @@ -53,10 +53,10 @@ #include "subtitle_format_transtation.h" #include "subtitle_format_ttxt.h" #include "subtitle_format_txt.h" -#include "utils.h" #include "video_context.h" #include +#include #include #include @@ -65,15 +65,16 @@ using namespace std::placeholders; +namespace { + std::vector> formats; +} + SubtitleFormat::SubtitleFormat(std::string name) : name(std::move(name)) { - formats.push_back(this); } -SubtitleFormat::~SubtitleFormat() { - formats.erase(remove(begin(formats), end(formats), this)); -} +SubtitleFormat::~SubtitleFormat() { } bool SubtitleFormat::CanReadFile(agi::fs::path const& filename, std::string const&) const { auto wildcards = GetReadWildcards(); @@ -289,33 +290,27 @@ void SubtitleFormat::MergeIdentical(AssFile &file) { } } -std::vector SubtitleFormat::formats; void SubtitleFormat::LoadFormats() { if (formats.empty()) { - new AssSubtitleFormat; - new Ebu3264SubtitleFormat; - new EncoreSubtitleFormat; - new MKVSubtitleFormat; - new MicroDVDSubtitleFormat; - new SRTSubtitleFormat; - new TTXTSubtitleFormat; - new TXTSubtitleFormat; - new TranStationSubtitleFormat; + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); + formats.emplace_back(agi::util::make_unique()); } } -void SubtitleFormat::DestroyFormats() { - while (!formats.empty()) - delete formats.back(); -} - template SubtitleFormat *find_or_throw(Cont &container, Pred pred) { auto it = find_if(container.begin(), container.end(), pred); if (it == container.end()) throw UnknownSubtitleFormatError("Subtitle format for extension not found", nullptr); - return *it; + return it->get(); } const SubtitleFormat *SubtitleFormat::GetReader(agi::fs::path const& filename, std::string const& encoding) { @@ -334,11 +329,11 @@ std::string SubtitleFormat::GetWildcards(int mode) { std::vector all; std::string final; - for (auto format : formats) { - std::vector cur = mode == 0 ? format->GetReadWildcards() : format->GetWriteWildcards(); + for (auto const& format : formats) { + auto cur = mode == 0 ? format->GetReadWildcards() : format->GetWriteWildcards(); if (cur.empty()) continue; - for_each(cur.begin(), cur.end(), [](std::string &str) { str.insert(0, "*."); }); + for (auto& str : cur) str.insert(0, "*."); all.insert(all.end(), begin(cur), end(cur)); final += "|" + format->GetName() + " (" + boost::join(cur, ",") + ")|" + boost::join(cur, ";"); } diff --git a/aegisub/src/subtitle_format.h b/aegisub/src/subtitle_format.h index 5d4f847ad..c8e241743 100644 --- a/aegisub/src/subtitle_format.h +++ b/aegisub/src/subtitle_format.h @@ -51,9 +51,6 @@ class SubtitleFormat { /// Get this format's wildcards for a save dialog virtual std::vector GetWriteWildcards() const { return {}; } - /// List of loaded subtitle formats - static std::vector formats; - public: /// Strip override tags static void StripTags(AssFile &file); @@ -77,10 +74,8 @@ public: /// Constructor /// @param Subtitle format name - /// @note Automatically registers the format SubtitleFormat(std::string name); /// Destructor - /// @note Automatically unregisters the format virtual ~SubtitleFormat(); /// Get this format's name @@ -126,8 +121,6 @@ public: static const SubtitleFormat *GetWriter(agi::fs::path const& filename); /// Initialize subtitle formats static void LoadFormats(); - /// Deinitialize subtitle formats - static void DestroyFormats(); }; DEFINE_SIMPLE_EXCEPTION(SubtitleFormatParseError, agi::InvalidInputException, "subtitle_io/parse/generic")