diff --git a/aegisub/src/main.cpp b/aegisub/src/main.cpp index 9b039068a..a66061f5f 100644 --- a/aegisub/src/main.cpp +++ b/aegisub/src/main.cpp @@ -294,7 +294,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 0c64b1670..b451bb3a8 100644 --- a/aegisub/src/subtitle_format.cpp +++ b/aegisub/src/subtitle_format.cpp @@ -53,11 +53,11 @@ #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 #include @@ -66,15 +66,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(); @@ -307,33 +308,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) { @@ -352,11 +347,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 9036ce4cf..a9be84d0a 100644 --- a/aegisub/src/subtitle_format.h +++ b/aegisub/src/subtitle_format.h @@ -52,9 +52,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); @@ -80,10 +77,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 @@ -129,8 +124,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")