diff --git a/aegisub/src/main.cpp b/aegisub/src/main.cpp index 9b039068a38fe8b76c67fcbc0d71fd4491b73b68..a66061f5fe777487453aed52728e144b85ec9f67 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 0c64b167003490e76de0062c6a9357ca09ef6552..b451bb3a8b169683735b9c9f3a985bf9a43e94ed 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 <libaegisub/fs.h> #include <libaegisub/of_type_adaptor.h> +#include <libaegisub/util.h> #include <algorithm> #include <boost/algorithm/string/join.hpp> @@ -66,15 +66,16 @@ using namespace std::placeholders; +namespace { + std::vector<std::unique_ptr<SubtitleFormat>> 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*> 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<AssSubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<Ebu3264SubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<EncoreSubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<MKVSubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<MicroDVDSubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<SRTSubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<TTXTSubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<TXTSubtitleFormat>()); + formats.emplace_back(agi::util::make_unique<TranStationSubtitleFormat>()); } } -void SubtitleFormat::DestroyFormats() { - while (!formats.empty()) - delete formats.back(); -} - template<class Cont, class Pred> 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<std::string> all; std::string final; - for (auto format : formats) { - std::vector<std::string> 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 9036ce4cf4d52f39a01f72d82538ee5e5e6a5349..a9be84d0a34748e9f4056c38b4ff864f8f6d4d3b 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<std::string> GetWriteWildcards() const { return {}; } - /// List of loaded subtitle formats - static std::vector<SubtitleFormat*> 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")