diff --git a/aegisub/src/main.cpp b/aegisub/src/main.cpp index 03dc418b2abe918b55d2a56f925898bc3fdd058b..6dc63d5066052366e0f549d2fd68784c24c4119a 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 36355dc69fc4152579032c4d095a345793f373fa..286249c2d1ece444275f52b84733f3b1e497ac0a 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 <libaegisub/fs.h> +#include <libaegisub/util.h> #include <algorithm> #include <boost/algorithm/string/join.hpp> @@ -65,15 +65,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(); @@ -289,33 +290,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) { @@ -334,11 +329,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 5d4f847ad5215806ecac6211b1ed85f11d990ece..c8e2417439aeca54594117e0b0297973c6d19c7d 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<std::string> GetWriteWildcards() const { return {}; } - /// List of loaded subtitle formats - static std::vector<SubtitleFormat*> 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")