From 7fc78d40abc54f5beb92070546e8144461098891 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Mon, 14 Apr 2014 10:58:46 -0700 Subject: [PATCH] Switch from boost::ptr_vector to a vector of unique_ptr ptr_vector hasn't been updated for C++11, so despite being specifically designed to store pointers to objects it's less safe and not really any easier to use than a regular vector of unique_ptrs --- .../include/libaegisub/of_type_adaptor.h | 8 ++++++ src/agi_pre.h | 1 - src/ass_dialogue.cpp | 26 +++++++++---------- src/ass_dialogue.h | 5 ++-- src/ass_karaoke.cpp | 14 +++++----- src/command/edit.cpp | 16 +++++++----- src/dialog_style_editor.cpp | 2 +- src/dialog_translation.cpp | 16 ++++++------ src/dialog_translation.h | 7 +++-- src/export_framerate.cpp | 2 +- src/font_file_lister.cpp | 7 +++-- src/resolution_resampler.cpp | 2 +- src/subtitle_format_ebu3264.cpp | 10 +++---- src/subtitle_format_srt.cpp | 10 +++---- src/visual_tool.cpp | 22 ++++++++-------- 15 files changed, 74 insertions(+), 74 deletions(-) diff --git a/libaegisub/include/libaegisub/of_type_adaptor.h b/libaegisub/include/libaegisub/of_type_adaptor.h index 46545a606..9b684dd06 100644 --- a/libaegisub/include/libaegisub/of_type_adaptor.h +++ b/libaegisub/include/libaegisub/of_type_adaptor.h @@ -33,6 +33,14 @@ namespace agi { return dynamic_cast(&ptr); } + template Type *operator()(std::unique_ptr& ptr) const { + return dynamic_cast(ptr.get()); + } + + template Type *operator()(std::unique_ptr const& ptr) const { + return dynamic_cast(ptr.get()); + } + template Type *operator()(InType *ptr) const { return dynamic_cast(ptr); } diff --git a/src/agi_pre.h b/src/agi_pre.h index af6e790f6..d020283e1 100644 --- a/src/agi_pre.h +++ b/src/agi_pre.h @@ -70,7 +70,6 @@ #endif #include -#include #include #include #include diff --git a/src/ass_dialogue.cpp b/src/ass_dialogue.cpp index 6f1f4236c..7902a9c70 100644 --- a/src/ass_dialogue.cpp +++ b/src/ass_dialogue.cpp @@ -168,13 +168,13 @@ std::string AssDialogue::GetData(bool ssa) const { return str; } -std::auto_ptr> AssDialogue::ParseTags() const { - boost::ptr_vector Blocks; +std::vector> AssDialogue::ParseTags() const { + std::vector> Blocks; // Empty line, make an empty block if (Text.get().empty()) { - Blocks.push_back(new AssDialogueBlockPlain); - return Blocks.release(); + Blocks.push_back(agi::util::make_unique()); + return Blocks; } int drawingLevel = 0; @@ -198,19 +198,19 @@ std::auto_ptr> AssDialogue::ParseTags() cons if (work.size() && work.find('\\') == std::string::npos) { //We've found an override block with no backslashes //We're going to assume it's a comment and not consider it an override block - Blocks.push_back(new AssDialogueBlockComment(work)); + Blocks.push_back(agi::util::make_unique(work)); } else { // Create block - auto block = new AssDialogueBlockOverride(work); + auto block = agi::util::make_unique(work); block->ParseTags(); - Blocks.push_back(block); // Look for \p in block for (auto const& tag : block->Tags) { if (tag.Name == "\\p") drawingLevel = tag.Params[0].Get(0); } + Blocks.push_back(std::move(block)); } continue; @@ -230,20 +230,20 @@ plain: } if (drawingLevel == 0) - Blocks.push_back(new AssDialogueBlockPlain(work)); + Blocks.push_back(agi::util::make_unique(work)); else - Blocks.push_back(new AssDialogueBlockDrawing(work, drawingLevel)); + Blocks.push_back(agi::util::make_unique(work, drawingLevel)); } - return Blocks.release(); + return Blocks; } void AssDialogue::StripTags() { Text = GetStrippedText(); } -static std::string get_text(AssDialogueBlock &d) { return d.GetText(); } -void AssDialogue::UpdateText(boost::ptr_vector& blocks) { +static std::string get_text(std::unique_ptr &d) { return d->GetText(); } +void AssDialogue::UpdateText(std::vector>& blocks) { if (blocks.empty()) return; Text = join(blocks | transformed(get_text), ""); } @@ -255,6 +255,6 @@ bool AssDialogue::CollidesWith(const AssDialogue *target) const { static std::string get_text_p(AssDialogueBlock *d) { return d->GetText(); } std::string AssDialogue::GetStrippedText() const { - boost::ptr_vector blocks(ParseTags()); + auto blocks = ParseTags(); return join(blocks | agi::of_type() | transformed(get_text_p), ""); } diff --git a/src/ass_dialogue.h b/src/ass_dialogue.h index 2c3105fe0..a1c96156d 100644 --- a/src/ass_dialogue.h +++ b/src/ass_dialogue.h @@ -40,7 +40,6 @@ #include #include -#include #include enum class AssBlockType { @@ -162,7 +161,7 @@ public: AssEntryGroup Group() const override { return AssEntryGroup::DIALOGUE; } /// Parse text as ASS and return block information - std::auto_ptr> ParseTags() const; + std::vector> ParseTags() const; /// Strip all ASS tags from the text void StripTags(); @@ -171,7 +170,7 @@ public: std::string GetStrippedText() const; /// Update the text of the line from parsed blocks - void UpdateText(boost::ptr_vector& blocks); + void UpdateText(std::vector>& blocks); std::string GetEntryData() const { return GetData(false); } /// Get the line as SSA rather than ASS diff --git a/src/ass_karaoke.cpp b/src/ass_karaoke.cpp index d9d315df4..e9622068d 100644 --- a/src/ass_karaoke.cpp +++ b/src/ass_karaoke.cpp @@ -99,20 +99,18 @@ void AssKaraoke::SetLine(AssDialogue *line, bool auto_split, bool normalize) { } void AssKaraoke::ParseSyllables(AssDialogue *line, Syllable &syl) { - boost::ptr_vector blocks(line->ParseTags()); + for (auto& block : line->ParseTags()) { + std::string text = block->GetText(); - for (auto& block : blocks) { - std::string text = block.GetText(); - - if (dynamic_cast(&block)) + if (dynamic_cast(block.get())) syl.text += text; - else if (dynamic_cast(&block)) + else if (dynamic_cast(block.get())) syl.ovr_tags[syl.text.size()] += text; - else if (dynamic_cast(&block)) + else if (dynamic_cast(block.get())) // drawings aren't override tags but they shouldn't show up in the // stripped text so pretend they are syl.ovr_tags[syl.text.size()] += text; - else if (AssDialogueBlockOverride *ovr = dynamic_cast(&block)) { + else if (AssDialogueBlockOverride *ovr = dynamic_cast(block.get())) { bool in_tag = false; for (auto& tag : ovr->Tags) { if (tag.IsValid() && boost::istarts_with(tag.Name, "\\k")) { diff --git a/src/command/edit.cpp b/src/command/edit.cpp index 815634e4d..51a6e6be0 100644 --- a/src/command/edit.cpp +++ b/src/command/edit.cpp @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -157,7 +158,7 @@ AssDialogue *paste_over(wxWindow *parent, std::vector& pasteOverOptions, A } template -T get_value(boost::ptr_vector const& blocks, int blockn, T initial, std::string const& tag_name, std::string alt = "") { +T get_value(std::vector> const& blocks, int blockn, T initial, std::string const& tag_name, std::string alt = "") { for (auto ovr : blocks | sliced(0, blockn + 1) | reversed | agi::of_type()) { for (auto const& tag : ovr->Tags | reversed) { if (tag.Name == tag_name || tag.Name == alt) @@ -197,7 +198,7 @@ int block_at_pos(std::string const& text, int pos) { return n - in_block; } -void set_tag(AssDialogue *line, boost::ptr_vector &blocks, std::string const& tag, std::string const& value, int &sel_start, int &sel_end, bool at_end = false) { +void set_tag(AssDialogue *line, std::vector> &blocks, std::string const& tag, std::string const& value, int &sel_start, int &sel_end, bool at_end = false) { if (blocks.empty()) blocks = line->ParseTags(); @@ -207,7 +208,7 @@ void set_tag(AssDialogue *line, boost::ptr_vector &blocks, std AssDialogueBlockPlain *plain = nullptr; AssDialogueBlockOverride *ovr = nullptr; while (blockn >= 0) { - AssDialogueBlock *block = &blocks[blockn]; + AssDialogueBlock *block = blocks[blockn].get(); if (dynamic_cast(block)) --blockn; else if (dynamic_cast(block)) { @@ -286,7 +287,7 @@ void toggle_override_tag(const agi::Context *c, bool (AssStyle::*field), const c AssStyle const* const style = c->ass->GetStyle(line->Style); bool state = style ? style->*field : AssStyle().*field; - boost::ptr_vector blocks(line->ParseTags()); + auto blocks = line->ParseTags(); int sel_start = c->textSelectionController->GetSelectionStart(); int sel_end = c->textSelectionController->GetSelectionEnd(); int blockn = block_at_pos(line->Text, sel_start); @@ -305,7 +306,7 @@ void show_color_picker(const agi::Context *c, agi::Color (AssStyle::*field), con AssStyle const* const style = c->ass->GetStyle(line->Style); agi::Color color = (style ? style->*field : AssStyle().*field); - boost::ptr_vector blocks(line->ParseTags()); + auto blocks = line->ParseTags(); int sel_start = c->textSelectionController->GetSelectionStart(); int sel_end = c->textSelectionController->GetSelectionEnd(); int blockn = block_at_pos(line->Text, sel_start); @@ -436,7 +437,7 @@ struct edit_font final : public Command { void operator()(agi::Context *c) override { AssDialogue *const line = c->selectionController->GetActiveLine(); - boost::ptr_vector blocks(line->ParseTags()); + auto blocks = line->ParseTags(); const int blockn = block_at_pos(line->Text, c->textSelectionController->GetInsertionPoint()); const AssStyle *style = c->ass->GetStyle(line->Style); @@ -1150,8 +1151,9 @@ struct edit_clear_text final : public Command { void operator()(agi::Context *c) override { AssDialogue *line = c->selectionController->GetActiveLine(); - boost::ptr_vector blocks(line->ParseTags()); + auto blocks = line->ParseTags(); line->Text = join(blocks + | indirected | filtered([](AssDialogueBlock const& b) { return b.GetType() != AssBlockType::PLAIN; }) | transformed(get_text), ""); diff --git a/src/dialog_style_editor.cpp b/src/dialog_style_editor.cpp index bf730b373..c95452de5 100644 --- a/src/dialog_style_editor.cpp +++ b/src/dialog_style_editor.cpp @@ -94,7 +94,7 @@ class StyleRenamer { found_any = true; } - boost::ptr_vector blocks(diag.ParseTags()); + auto blocks = diag.ParseTags(); for (auto block : blocks | agi::of_type()) block->ProcessParameters(&StyleRenamer::ProcessTag, this); if (replace) diff --git a/src/dialog_translation.cpp b/src/dialog_translation.cpp index 357092385..850d2f42e 100644 --- a/src/dialog_translation.cpp +++ b/src/dialog_translation.cpp @@ -56,8 +56,8 @@ static void add_hotkey(wxSizer *sizer, wxWindow *parent, const char *command, wx } // Skip over override blocks, comments, and whitespace between blocks -static bool bad_block(AssDialogueBlock &block) { - return block.GetType() != AssBlockType::PLAIN || boost::all(block.GetText(), boost::is_space()); +static bool bad_block(std::unique_ptr &block) { + return block->GetType() != AssBlockType::PLAIN || boost::all(block->GetText(), boost::is_space()); } DialogTranslation::DialogTranslation(agi::Context *c) @@ -245,17 +245,17 @@ void DialogTranslation::UpdateDisplay() { size_t i = 0; for (auto& block : blocks) { - if (block.GetType() == AssBlockType::PLAIN) { + if (block->GetType() == AssBlockType::PLAIN) { int initial_pos = original_text->GetLength(); - original_text->AppendTextRaw(block.GetText().c_str()); + original_text->AppendTextRaw(block->GetText().c_str()); if (i == cur_block) { int cur_size = original_text->GetReverseUnicodePosition(initial_pos); original_text->StartUnicodeStyling(cur_size); - original_text->SetUnicodeStyling(cur_size, block.GetText().size(), 1); + original_text->SetUnicodeStyling(cur_size, block->GetText().size(), 1); } } else - original_text->AppendTextRaw(block.GetText().c_str()); + original_text->AppendTextRaw(block->GetText().c_str()); ++i; } @@ -272,7 +272,7 @@ void DialogTranslation::Commit(bool next) { new_value.Replace("\r\n", "\\N"); new_value.Replace("\r", "\\N"); new_value.Replace("\n", "\\N"); - blocks[cur_block] = AssDialogueBlockPlain(from_wx(new_value)); + *blocks[cur_block] = AssDialogueBlockPlain(from_wx(new_value)); active_line->UpdateText(blocks); file_change_connection.Block(); @@ -291,7 +291,7 @@ void DialogTranslation::Commit(bool next) { } void DialogTranslation::InsertOriginal() { - translated_text->AddText(to_wx(blocks[cur_block].GetText())); + translated_text->AddText(to_wx(blocks[cur_block]->GetText())); } diff --git a/src/dialog_translation.h b/src/dialog_translation.h index 538920b80..6d2ad804b 100644 --- a/src/dialog_translation.h +++ b/src/dialog_translation.h @@ -18,13 +18,12 @@ /// @see dialog_translation.cpp /// @ingroup tools_ui -#include - #include #include -#include #include +#include +#include namespace agi { struct Context; } class AssDialogue; @@ -45,7 +44,7 @@ class DialogTranslation final : public wxDialog { /// The active line AssDialogue *active_line; /// The parsed dialogue blocks for the active line - boost::ptr_vector blocks; + std::vector> blocks; /// Which dialogue block in the active line is currently being translated size_t cur_block = 0; diff --git a/src/export_framerate.cpp b/src/export_framerate.cpp index b7d4f1edd..12cce72ca 100644 --- a/src/export_framerate.cpp +++ b/src/export_framerate.cpp @@ -209,7 +209,7 @@ void AssTransformFramerateFilter::TransformFrameRate(AssFile *subs) { newEnd = trunc_cs(ConvertTime(curDialogue.End) + 9); // Process stuff - boost::ptr_vector blocks; + auto blocks = line->ParseTags(); for (auto block : blocks | agi::of_type()) block->ProcessParameters(TransformTimeTags, this); curDialogue.Start = newStart; diff --git a/src/font_file_lister.cpp b/src/font_file_lister.cpp index 7568841bd..146ebee35 100644 --- a/src/font_file_lister.cpp +++ b/src/font_file_lister.cpp @@ -73,14 +73,13 @@ void FontCollector::ProcessDialogueLine(const AssDialogue *line, int index) { return; } - boost::ptr_vector blocks(line->ParseTags()); StyleInfo style = style_it->second; StyleInfo initial = style; bool overriden = false; - for (auto& block : blocks) { - if (AssDialogueBlockOverride *ovr = dynamic_cast(&block)) { + for (auto& block : line->ParseTags()) { + if (AssDialogueBlockOverride *ovr = dynamic_cast(block.get())) { for (auto const& tag : ovr->Tags) { std::string const& name = tag.Name; @@ -102,7 +101,7 @@ void FontCollector::ProcessDialogueLine(const AssDialogue *line, int index) { } } } - else if (AssDialogueBlockPlain *txt = dynamic_cast(&block)) { + else if (AssDialogueBlockPlain *txt = dynamic_cast(block.get())) { wxString text(to_wx(txt->GetText())); if (text.empty()) diff --git a/src/resolution_resampler.cpp b/src/resolution_resampler.cpp index c1179fe11..d4cd155ed 100644 --- a/src/resolution_resampler.cpp +++ b/src/resolution_resampler.cpp @@ -129,7 +129,7 @@ namespace { if (diag.Comment && (boost::starts_with(diag.Effect.get(), "template") || boost::starts_with(diag.Effect.get(), "code"))) return; - boost::ptr_vector blocks(diag.ParseTags()); + auto blocks = diag.ParseTags(); for (auto block : blocks | agi::of_type()) block->ProcessParameters(resample_tags, state); diff --git a/src/subtitle_format_ebu3264.cpp b/src/subtitle_format_ebu3264.cpp index cf5881c28..f8134d432 100644 --- a/src/subtitle_format_ebu3264.cpp +++ b/src/subtitle_format_ebu3264.cpp @@ -259,8 +259,6 @@ namespace void SetTextFromAss(AssDialogue *line, bool style_underline, bool style_italic, int align, int wrap_mode) { - boost::ptr_vector blocks(line->ParseTags()); - text_rows.clear(); text_rows.emplace_back(); @@ -272,14 +270,14 @@ namespace bool underline = style_underline, italic = style_italic; - for (auto& b : blocks) + for (auto& b : line->ParseTags()) { - switch (b.GetType()) + switch (b->GetType()) { case AssBlockType::PLAIN: // find special characters and convert them { - std::string text = b.GetText(); + std::string text = b->GetText(); boost::replace_all(text, "\\t", " "); @@ -321,7 +319,7 @@ namespace case AssBlockType::OVERRIDE: // find relevant tags and process them { - AssDialogueBlockOverride *ob = static_cast(&b); + AssDialogueBlockOverride *ob = static_cast(b.get()); ob->ParseTags(); ProcessOverrides(ob, underline, italic, align, style_underline, style_italic); diff --git a/src/subtitle_format_srt.cpp b/src/subtitle_format_srt.cpp index db0cd9a47..4b19933c2 100644 --- a/src/subtitle_format_srt.cpp +++ b/src/subtitle_format_srt.cpp @@ -501,7 +501,7 @@ bool SRTSubtitleFormat::CanSave(const AssFile *file) const { } for (auto const& line : file->Events) { - boost::ptr_vector blocks(line.ParseTags()); + auto blocks = line.ParseTags(); for (auto ovr : blocks | agi::of_type()) { // Verify that all overrides used are supported for (auto const& tag : ovr->Tags) { @@ -522,10 +522,8 @@ std::string SRTSubtitleFormat::ConvertTags(const AssDialogue *diag) const { tag_states['u'] = false; tag_states['s'] = false; - boost::ptr_vector blocks(diag->ParseTags()); - - for (auto& block : blocks) { - if (AssDialogueBlockOverride* ovr = dynamic_cast(&block)) { + for (auto& block : diag->ParseTags()) { + if (AssDialogueBlockOverride* ovr = dynamic_cast(block.get())) { // Iterate through overrides for (auto const& tag : ovr->Tags) { if (tag.IsValid() && tag.Name.size() == 2) { @@ -542,7 +540,7 @@ std::string SRTSubtitleFormat::ConvertTags(const AssDialogue *diag) const { } } // Plain text - else if (AssDialogueBlockPlain *plain = dynamic_cast(&block)) + else if (AssDialogueBlockPlain *plain = dynamic_cast(block.get())) final += plain->GetText(); } diff --git a/src/visual_tool.cpp b/src/visual_tool.cpp index 761437911..b1f29f4bd 100644 --- a/src/visual_tool.cpp +++ b/src/visual_tool.cpp @@ -331,7 +331,7 @@ void VisualTool::RemoveSelection(FeatureType *feat) { typedef const std::vector * param_vec; // Find a tag's parameters in a line or return nullptr if it's not found -static param_vec find_tag(boost::ptr_vector& blocks, std::string const& tag_name) { +static param_vec find_tag(std::vector>& blocks, std::string const& tag_name) { for (auto ovr : blocks | agi::of_type()) { for (auto const& tag : ovr->Tags) { if (tag.Name == tag_name) @@ -354,7 +354,7 @@ static Vector2D vec_or_bad(param_vec tag, size_t x_idx, size_t y_idx) { } Vector2D VisualToolBase::GetLinePosition(AssDialogue *diag) { - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); if (Vector2D ret = vec_or_bad(find_tag(blocks, "\\pos"), 0, 1)) return ret; if (Vector2D ret = vec_or_bad(find_tag(blocks, "\\move"), 0, 1)) return ret; @@ -405,12 +405,12 @@ Vector2D VisualToolBase::GetLinePosition(AssDialogue *diag) { } Vector2D VisualToolBase::GetLineOrigin(AssDialogue *diag) { - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); return vec_or_bad(find_tag(blocks, "\\org"), 0, 1); } bool VisualToolBase::GetLineMove(AssDialogue *diag, Vector2D &p1, Vector2D &p2, int &t1, int &t2) { - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); param_vec tag = find_tag(blocks, "\\move"); if (!tag) @@ -431,7 +431,7 @@ void VisualToolBase::GetLineRotation(AssDialogue *diag, float &rx, float &ry, fl if (AssStyle *style = c->ass->GetStyle(diag->Style)) rz = style->angle; - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); if (param_vec tag = find_tag(blocks, "\\frx")) rx = tag->front().Get(rx); @@ -446,7 +446,7 @@ void VisualToolBase::GetLineRotation(AssDialogue *diag, float &rx, float &ry, fl void VisualToolBase::GetLineShear(AssDialogue *diag, float& fax, float& fay) { fax = fay = 0.f; - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); if (param_vec tag = find_tag(blocks, "\\fax")) fax = tag->front().Get(fax); @@ -462,7 +462,7 @@ void VisualToolBase::GetLineScale(AssDialogue *diag, Vector2D &scale) { y = style->scaley; } - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); if (param_vec tag = find_tag(blocks, "\\fscx")) x = tag->front().Get(x); @@ -475,7 +475,7 @@ void VisualToolBase::GetLineScale(AssDialogue *diag, Vector2D &scale) { void VisualToolBase::GetLineClip(AssDialogue *diag, Vector2D &p1, Vector2D &p2, bool &inverse) { inverse = false; - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); param_vec tag = find_tag(blocks, "\\iclip"); if (tag) inverse = true; @@ -493,7 +493,7 @@ void VisualToolBase::GetLineClip(AssDialogue *diag, Vector2D &p1, Vector2D &p2, } std::string VisualToolBase::GetLineVectorClip(AssDialogue *diag, int &scale, bool &inverse) { - boost::ptr_vector blocks(diag->ParseTags()); + auto blocks = diag->ParseTags(); scale = 1; inverse = false; @@ -536,8 +536,8 @@ void VisualToolBase::SetOverride(AssDialogue* line, std::string const& tag, std: else if (tag == "\\iclip") removeTag = "\\clip"; // Get block at start - boost::ptr_vector blocks(line->ParseTags()); - AssDialogueBlock *block = &blocks.front(); + auto blocks = line->ParseTags(); + AssDialogueBlock *block = blocks.front().get(); if (AssDialogueBlockOverride *ovr = dynamic_cast(block)) { // Remove old of same