From 72d4577d7d249ebdb93b77cb475fcf49eaa0b28d Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Mon, 10 Jun 2013 06:58:13 -0700 Subject: [PATCH] Kill scoped_ptr in favor of unique_ptr --- aegisub/libaegisub/common/charset_6937.h | 3 +- aegisub/libaegisub/common/charset_conv.cpp | 2 +- aegisub/libaegisub/common/option.cpp | 5 +-- aegisub/libaegisub/common/option_visit.cpp | 33 ++++++-------- aegisub/libaegisub/common/option_visit.h | 5 ++- .../include/libaegisub/charset_conv.h | 4 +- .../libaegisub/include/libaegisub/option.h | 6 +-- .../include/libaegisub/scoped_ptr.h | 28 ------------ aegisub/src/audio_karaoke.h | 4 +- aegisub/src/audio_player_alsa.h | 8 ++-- aegisub/src/audio_renderer_spectrum.cpp | 3 +- aegisub/src/audio_renderer_spectrum.h | 5 +-- aegisub/src/auto4_lua.h | 5 +-- aegisub/src/auto4_lua_assfile.cpp | 38 ++++++++-------- aegisub/src/auto4_lua_dialog.cpp | 38 ++++++++-------- aegisub/src/base_grid.cpp | 4 +- aegisub/src/base_grid.h | 3 +- aegisub/src/command/vis_tool.cpp | 2 +- aegisub/src/dialog_colorpicker.cpp | 6 ++- aegisub/src/dialog_detached_video.cpp | 4 +- aegisub/src/dialog_detached_video.h | 4 +- aegisub/src/dialog_export.h | 5 +-- aegisub/src/dialog_export_ebu3264.cpp | 18 ++++---- aegisub/src/dialog_export_ebu3264.h | 7 +-- aegisub/src/dialog_search_replace.h | 4 +- aegisub/src/dialog_shift_times.h | 5 ++- aegisub/src/dialog_style_editor.cpp | 21 ++++----- aegisub/src/dialog_style_editor.h | 8 ++-- aegisub/src/dialog_style_manager.cpp | 2 +- aegisub/src/dialog_style_manager.h | 4 +- aegisub/src/dialog_styling_assistant.cpp | 5 ++- aegisub/src/dialog_styling_assistant.h | 5 +-- aegisub/src/dialog_translation.cpp | 4 +- aegisub/src/dialog_translation.h | 4 +- aegisub/src/hotkey_data_view_model.h | 5 +-- aegisub/src/include/aegisub/menu.h | 3 +- aegisub/src/menu.cpp | 7 +-- aegisub/src/subs_edit_box.cpp | 3 +- aegisub/src/subs_edit_box.h | 4 +- aegisub/src/subtitle_format_ebu3264.cpp | 17 ++++--- aegisub/src/video_display.cpp | 44 ++++++++++--------- aegisub/src/video_display.h | 24 +++++----- aegisub/src/visual_tool_cross.h | 6 +-- 43 files changed, 191 insertions(+), 224 deletions(-) diff --git a/aegisub/libaegisub/common/charset_6937.h b/aegisub/libaegisub/common/charset_6937.h index b485404f1..589537092 100644 --- a/aegisub/libaegisub/common/charset_6937.h +++ b/aegisub/libaegisub/common/charset_6937.h @@ -17,6 +17,7 @@ /// @ingroup libaegisub #include +#include namespace agi { namespace charset { @@ -26,7 +27,7 @@ namespace agi { namespace charset { /// it's not used by anything but old subtitle formats class Converter6937 : public Converter { /// Converter to UCS-4 so that we only have to deal with unicode codepoints - agi::scoped_ptr to_ucs4; + std::unique_ptr to_ucs4; /// Should unsupported characters be replaced with '?' const bool subst; diff --git a/aegisub/libaegisub/common/charset_conv.cpp b/aegisub/libaegisub/common/charset_conv.cpp index 927f4e958..7d537680f 100644 --- a/aegisub/libaegisub/common/charset_conv.cpp +++ b/aegisub/libaegisub/common/charset_conv.cpp @@ -118,7 +118,7 @@ namespace { size_t nul_size(const char* encoding) { // We need a character set to convert from with a known encoding of NUL // UTF-8 seems like the obvious choice - agi::scoped_ptr cd(get_converter(false, "UTF-8", encoding)); + std::unique_ptr cd(get_converter(false, "UTF-8", encoding)); char dbuff[4]; char sbuff[] = ""; diff --git a/aegisub/libaegisub/common/option.cpp b/aegisub/libaegisub/common/option.cpp index f57bd6a91..a70b92eb0 100644 --- a/aegisub/libaegisub/common/option.cpp +++ b/aegisub/libaegisub/common/option.cpp @@ -78,9 +78,6 @@ Options::Options(agi::fs::path const& file, const std::string& default_config, c Options::~Options() { if ((setting & FLUSH_SKIP) != FLUSH_SKIP) Flush(); - - for (auto option_value : values | boost::adaptors::map_values) - delete option_value; } void Options::ConfigNext(std::istream& stream) { @@ -117,7 +114,7 @@ void Options::LoadConfig(std::istream& stream, bool ignore_errors) { OptionValue* Options::Get(const std::string &name) { auto index = values.find(name); if (index != values.end()) - return index->second; + return index->second.get(); LOG_E("option/get") << "agi::Options::Get Option not found: (" << name << ")"; throw OptionErrorNotFound("Option value not found: " + name); diff --git a/aegisub/libaegisub/common/option_visit.cpp b/aegisub/libaegisub/common/option_visit.cpp index 60bbca8f4..28a1e62b0 100644 --- a/aegisub/libaegisub/common/option_visit.cpp +++ b/aegisub/libaegisub/common/option_visit.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include @@ -60,7 +60,7 @@ void ConfigVisitor::Visit(const json::Object& object) { } template -OptionValue *ConfigVisitor::ReadArray(json::Array const& src, std::string const& array_type, void (OptionValueType::*)(const std::vector&)) { +std::unique_ptr ConfigVisitor::ReadArray(json::Array const& src, std::string const& array_type, void (OptionValueType::*)(const std::vector&)) { std::vector arr; arr.reserve(src.size()); @@ -77,7 +77,7 @@ OptionValue *ConfigVisitor::ReadArray(json::Array const& src, std::string const& arr.push_back(ValueType(obj.begin()->second)); } - return new OptionValueType(name, arr); + return util::make_unique(name, arr); } void ConfigVisitor::Visit(const json::Array& array) { @@ -109,11 +109,11 @@ void ConfigVisitor::Visit(const json::Array& array) { } void ConfigVisitor::Visit(const json::Integer& number) { - AddOptionValue(new OptionValueInt(name, number)); + AddOptionValue(util::make_unique(name, number)); } void ConfigVisitor::Visit(const json::Double& number) { - AddOptionValue(new OptionValueDouble(name, number)); + AddOptionValue(util::make_unique(name, number)); } void ConfigVisitor::Visit(const json::String& string) { @@ -123,39 +123,34 @@ void ConfigVisitor::Visit(const json::String& string) { (size >= 10 && boost::starts_with(string, "rgb(")) || ((size == 9 || size == 10) && boost::starts_with(string, "&H"))) { - AddOptionValue(new OptionValueColor(name, string)); + AddOptionValue(util::make_unique(name, string)); } else { - AddOptionValue(new OptionValueString(name, string)); + AddOptionValue(util::make_unique(name, string)); } } void ConfigVisitor::Visit(const json::Boolean& boolean) { - AddOptionValue(new OptionValueBool(name, boolean)); + AddOptionValue(util::make_unique(name, boolean)); } void ConfigVisitor::Visit(const json::Null& null) { Error("Attempt to read null value"); } -void ConfigVisitor::AddOptionValue(OptionValue* opt) { +void ConfigVisitor::AddOptionValue(std::unique_ptr&& opt) { if (!opt) { assert(ignore_errors); return; } - OptionValueMap::iterator it = values.find(name); + auto it = values.find(name); if (it == values.end()) - values[name] = opt; - else if (replace) { - delete it->second; - it->second = opt; - } + values[name] = std::move(opt); + else if (replace) + it->second = std::move(opt); else { try { - // Ensure than opt is deleted at the end of this function even if the Set - // method throws - agi::scoped_ptr auto_opt(opt); - values[name]->Set(opt); + values[name]->Set(opt.get()); } catch (agi::OptionValueError const& e) { if (ignore_errors) diff --git a/aegisub/libaegisub/common/option_visit.h b/aegisub/libaegisub/common/option_visit.h index 3468c05e7..76f666169 100644 --- a/aegisub/libaegisub/common/option_visit.h +++ b/aegisub/libaegisub/common/option_visit.h @@ -21,6 +21,7 @@ #include "libaegisub/cajun/elements.h" #include "libaegisub/cajun/visitor.h" +#include #include namespace agi { @@ -46,9 +47,9 @@ class ConfigVisitor : public json::ConstVisitor { void Error(const char *message); template - OptionValue *ReadArray(json::Array const& src, std::string const& array_type, void (OptionValueType::*set_list)(const std::vector&)); + std::unique_ptr ReadArray(json::Array const& src, std::string const& array_type, void (OptionValueType::*set_list)(const std::vector&)); - void AddOptionValue(OptionValue* opt); + void AddOptionValue(std::unique_ptr&& opt); public: ConfigVisitor(OptionValueMap &val, const std::string &member_name, bool ignore_errors = false, bool replace = false); diff --git a/aegisub/libaegisub/include/libaegisub/charset_conv.h b/aegisub/libaegisub/include/libaegisub/charset_conv.h index e90e16a38..4d7352eb9 100644 --- a/aegisub/libaegisub/include/libaegisub/charset_conv.h +++ b/aegisub/libaegisub/include/libaegisub/charset_conv.h @@ -19,11 +19,11 @@ #pragma once #include +#include #include #include #include -#include namespace agi { namespace charset { @@ -48,7 +48,7 @@ struct Converter { class IconvWrapper { size_t toNulLen; size_t fromNulLen; - agi::scoped_ptr conv; + std::unique_ptr conv; public: /// @brief Create a converter diff --git a/aegisub/libaegisub/include/libaegisub/option.h b/aegisub/libaegisub/include/libaegisub/option.h index 974ae9824..583209d7b 100644 --- a/aegisub/libaegisub/include/libaegisub/option.h +++ b/aegisub/libaegisub/include/libaegisub/option.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -38,10 +39,7 @@ DEFINE_SIMPLE_EXCEPTION_NOINNER(OptionErrorDuplicateKey, OptionError, "options/d class OptionValue; -/// This is a cool trick: make a class un-copyable, in this case we always want -/// to update our *original* map, this will ensure that it is always updated in -/// every situation. -class OptionValueMap : public std::map { +class OptionValueMap : public std::map> { private: OptionValueMap(const OptionValueMap& x); OptionValueMap& operator=(const OptionValueMap& x); diff --git a/aegisub/libaegisub/include/libaegisub/scoped_ptr.h b/aegisub/libaegisub/include/libaegisub/scoped_ptr.h index 2b767a666..6267fe7e1 100644 --- a/aegisub/libaegisub/include/libaegisub/scoped_ptr.h +++ b/aegisub/libaegisub/include/libaegisub/scoped_ptr.h @@ -19,33 +19,6 @@ #pragma once namespace agi { - -/// @class scoped_ptr -/// @brief auto_ptr without the transfer of ownership semantics -template -class scoped_ptr { - T* ptr; - scoped_ptr(scoped_ptr const&); - scoped_ptr& operator=(scoped_ptr const&); - - typedef T *scoped_ptr::*unspecified_bool_type; -public: - typedef T element_type; - - T& operator*() const {return *ptr; } - T* operator->() const { return ptr; } - T* get() const { return ptr; } - operator unspecified_bool_type() const { return ptr ? &scoped_ptr::ptr : 0; } - - void reset(T *p = 0) { - delete ptr; - ptr = p; - } - - explicit scoped_ptr(T *ptr = 0) : ptr(ptr){ } - ~scoped_ptr() { delete ptr; } -}; - /// A generic scoped holder for non-pointer handles template class scoped_holder { @@ -73,5 +46,4 @@ public: ~scoped_holder() { if (value) destructor(value); } }; - } diff --git a/aegisub/src/audio_karaoke.h b/aegisub/src/audio_karaoke.h index 46b362777..0be105088 100644 --- a/aegisub/src/audio_karaoke.h +++ b/aegisub/src/audio_karaoke.h @@ -19,9 +19,9 @@ /// @ingroup audio_ui /// -#include #include +#include #include #include #include @@ -78,7 +78,7 @@ class AudioKaraoke : public wxWindow { /// Currently active dialogue line AssDialogue *active_line; /// Karaoke data - agi::scoped_ptr kara; + std::unique_ptr kara; /// Current line's stripped text with spaces added between each syllable std::vector spaced_text; diff --git a/aegisub/src/audio_player_alsa.h b/aegisub/src/audio_player_alsa.h index bff1457c9..2f092dcb5 100644 --- a/aegisub/src/audio_player_alsa.h +++ b/aegisub/src/audio_player_alsa.h @@ -33,17 +33,15 @@ /// #ifdef WITH_ALSA - -#include - #include "include/aegisub/audio_player.h" -#include +#include +#include struct PlaybackState; class AlsaPlayer : public AudioPlayer { - agi::scoped_ptr ps; + std::unique_ptr ps; pthread_t thread; public: diff --git a/aegisub/src/audio_renderer_spectrum.cpp b/aegisub/src/audio_renderer_spectrum.cpp index b05f6ee59..7f8ba1d71 100644 --- a/aegisub/src/audio_renderer_spectrum.cpp +++ b/aegisub/src/audio_renderer_spectrum.cpp @@ -44,6 +44,7 @@ #include "utils.h" #include +#include #include @@ -138,7 +139,7 @@ void AudioSpectrumRenderer::RecreateCache() if (provider) { size_t block_count = (size_t)((provider->GetNumSamples() + (size_t)(1<> derivation_dist); - cache.reset(new AudioSpectrumCache(block_count, this)); + cache = agi::util::make_unique(block_count, this); #ifdef WITH_FFTW3 dft_input = fftw_alloc_real(2< +#include #include #include "audio_renderer.h" -#include - #ifdef WITH_FFTW3 #include #endif @@ -57,7 +56,7 @@ class AudioSpectrumRenderer : public AudioRendererBitmapProvider { friend struct AudioSpectrumCacheBlockFactory; /// Internal cache management for the spectrum - agi::scoped_ptr cache; + std::unique_ptr cache; /// Colour tables used for rendering std::vector colors; diff --git a/aegisub/src/auto4_lua.h b/aegisub/src/auto4_lua.h index 2f7899e54..ba1dfb35a 100644 --- a/aegisub/src/auto4_lua.h +++ b/aegisub/src/auto4_lua.h @@ -108,7 +108,7 @@ namespace Automation4 { /// makes a Lua representation of AssEntry and places on the top of the stack static void AssEntryToLua(lua_State *L, AssEntry *e); /// assumes a Lua representation of AssEntry on the top of the stack, and creates an AssEntry object of it - static AssEntry *LuaToAssEntry(lua_State *L); + static std::unique_ptr LuaToAssEntry(lua_State *L); /// @brief Signal that the script using this file is now done running /// @param set_undo If there's any uncommitted changes to the file, @@ -186,7 +186,7 @@ namespace Automation4 { /// A lua-generated dialog or panel in the export options dialog class LuaDialog : public ScriptDialog { /// Controls in this dialog - std::vector controls; + std::vector> controls; /// The names and IDs of buttons in this dialog if non-default ones were used std::vector> buttons; @@ -200,7 +200,6 @@ namespace Automation4 { public: LuaDialog(lua_State *L, bool include_buttons); - ~LuaDialog(); /// Push the values of the controls in this dialog onto the lua stack /// in a single table diff --git a/aegisub/src/auto4_lua_assfile.cpp b/aegisub/src/auto4_lua_assfile.cpp index 8315f93bf..aaa10cc1c 100644 --- a/aegisub/src/auto4_lua_assfile.cpp +++ b/aegisub/src/auto4_lua_assfile.cpp @@ -45,13 +45,14 @@ #include "utils.h" #include -#include +#include #include #include #include #include #include +#include namespace { DEFINE_SIMPLE_EXCEPTION_NOINNER(BadField, Automation4::MacroRunError, "automation/macro/bad_field") @@ -219,7 +220,7 @@ namespace Automation4 { } } - AssEntry *LuaAssFile::LuaToAssEntry(lua_State *L) + std::unique_ptr LuaAssFile::LuaToAssEntry(lua_State *L) { // assume an assentry table is on the top of the stack // convert it to a real AssEntry object, and pop the table from the stack @@ -235,14 +236,14 @@ namespace Automation4 { boost::to_lower(lclass); lua_pop(L, 1); - AssEntry *result = 0; + std::unique_ptr result; try { if (lclass == "info") - result = new AssInfo(get_string_field(L, "key", "info"), get_string_field(L, "value", "info")); + result = agi::util::make_unique(get_string_field(L, "key", "info"), get_string_field(L, "value", "info")); else if (lclass == "style") { AssStyle *sty = new AssStyle; - result = sty; + result.reset(sty); sty->name = get_string_field(L, "name", "style"); sty->font = get_string_field(L, "fontname", "style"); sty->fontsize = get_double_field(L, "fontsize", "style"); @@ -270,7 +271,7 @@ namespace Automation4 { } else if (lclass == "dialogue") { AssDialogue *dia = new AssDialogue; - result = dia; + result.reset(dia); dia->Comment = get_bool_field(L, "comment", "dialogue"); dia->Layer = get_int_field(L, "layer", "dialogue"); @@ -292,9 +293,8 @@ namespace Automation4 { return result; } catch (agi::Exception const& e) { - delete result; luaL_error(L, e.GetMessage().c_str()); - return 0; + return nullptr; } } @@ -373,11 +373,11 @@ namespace Automation4 { // replace line at index n or delete if (!lua_isnil(L, 3)) { // insert - AssEntry *e = LuaToAssEntry(L); - modification_type |= modification_mask(e); + auto e = LuaToAssEntry(L); + modification_type |= modification_mask(e.get()); CheckBounds(n); lines_to_delete.push_back(lines[n - 1]); - lines[n - 1] = e; + lines[n - 1] = e.release(); } else { // delete @@ -453,8 +453,8 @@ namespace Automation4 { for (int i = 1; i <= n; i++) { lua_pushvalue(L, i); - AssEntry *e = LuaToAssEntry(L); - modification_type |= modification_mask(e); + auto e = LuaToAssEntry(L); + modification_type |= modification_mask(e.get()); // Find the appropriate place to put it auto it = lines.end(); @@ -468,11 +468,11 @@ namespace Automation4 { if (it == lines.end() || (*it)->Group() != e->Group()) { // The new entry belongs to a group that doesn't exist yet, so // create it at the end of the file - lines.push_back(e); + lines.push_back(e.release()); } else { // Append the entry to the end of the existing group - lines.insert(++it, e); + lines.insert(++it, e.release()); } } } @@ -497,9 +497,9 @@ namespace Automation4 { std::vector new_entries(n - 1, nullptr); for (int i = 2; i <= n; i++) { lua_pushvalue(L, i); - AssEntry *e = LuaToAssEntry(L); - modification_type |= modification_mask(e); - new_entries[i - 2] = e; + auto e = LuaToAssEntry(L); + modification_type |= modification_mask(e.get()); + new_entries[i - 2] = e.release(); lua_pop(L, 1); } lines.insert(lines.begin() + before - 1, new_entries.begin(), new_entries.end()); @@ -536,7 +536,7 @@ namespace Automation4 { int LuaAssFile::LuaParseKaraokeData(lua_State *L) { - agi::scoped_ptr e(LuaToAssEntry(L)); + auto e = LuaToAssEntry(L); AssDialogue *dia = dynamic_cast(e.get()); luaL_argcheck(L, dia, 1, "Subtitle line must be a dialogue line"); diff --git a/aegisub/src/auto4_lua_dialog.cpp b/aegisub/src/auto4_lua_dialog.cpp index 351939088..2a547f522 100644 --- a/aegisub/src/auto4_lua_dialog.cpp +++ b/aegisub/src/auto4_lua_dialog.cpp @@ -44,6 +44,8 @@ #include "utils.h" #include "validators.h" +#include + #include #include #include @@ -432,34 +434,34 @@ namespace Automation4 { std::string controlclass = get_field(L, "class"); boost::to_lower(controlclass); - LuaDialogControl *ctl; + std::unique_ptr ctl; // Check control class and create relevant control if (controlclass == "label") - ctl = new LuaControl::Label(L); + ctl = agi::util::make_unique(L); else if (controlclass == "edit") - ctl = new LuaControl::Edit(L); + ctl = agi::util::make_unique(L); else if (controlclass == "intedit") - ctl = new LuaControl::IntEdit(L); + ctl = agi::util::make_unique(L); else if (controlclass == "floatedit") - ctl = new LuaControl::FloatEdit(L); + ctl = agi::util::make_unique(L); else if (controlclass == "textbox") - ctl = new LuaControl::Textbox(L); + ctl = agi::util::make_unique(L); else if (controlclass == "dropdown") - ctl = new LuaControl::Dropdown(L); + ctl = agi::util::make_unique(L); else if (controlclass == "checkbox") - ctl = new LuaControl::Checkbox(L); + ctl = agi::util::make_unique(L); else if (controlclass == "color") - ctl = new LuaControl::Color(L, false); + ctl = agi::util::make_unique(L, false); else if (controlclass == "coloralpha") - ctl = new LuaControl::Color(L, true); + ctl = agi::util::make_unique(L, true); else if (controlclass == "alpha") // FIXME - ctl = new LuaControl::Edit(L); + ctl = agi::util::make_unique(L); else luaL_error(L, "bad control table entry"); - controls.push_back(ctl); + controls.emplace_back(std::move(ctl)); }); if (include_buttons && lua_istable(L, 2)) { @@ -483,15 +485,11 @@ namespace Automation4 { } } - LuaDialog::~LuaDialog() { - delete_clear(controls); - } - wxWindow* LuaDialog::CreateWindow(wxWindow *parent) { window = new wxPanel(parent); auto s = new wxGridBagSizer(4, 4); - for (auto c : controls) + for (auto& c : controls) s->Add(c->Create(window), wxGBPosition(c->y, c->x), wxGBSpan(c->height, c->width), c->GetSizerFlags()); @@ -556,7 +554,7 @@ namespace Automation4 { // Then read controls back lua_newtable(L); - for (auto control : controls) { + for (auto& control : controls) { control->LuaReadBack(L); lua_setfield(L, -2, control->name.c_str()); } @@ -568,7 +566,7 @@ namespace Automation4 { std::string res; // Format into "name1:value1|name2:value2|name3:value3" - for (auto control : controls) { + for (auto& control : controls) { if (control->CanSerialiseValue()) { if (!res.empty()) res += "|"; @@ -589,7 +587,7 @@ namespace Automation4 { std::string value = cur.substr(pos + 1); // Hand value to all controls matching name - for (auto control : controls) { + for (auto& control : controls) { if (control->name == name && control->CanSerialiseValue()) control->UnserialiseValue(value); } diff --git a/aegisub/src/base_grid.cpp b/aegisub/src/base_grid.cpp index d62e4e3da..ff3718dd0 100644 --- a/aegisub/src/base_grid.cpp +++ b/aegisub/src/base_grid.cpp @@ -97,7 +97,6 @@ BaseGrid::BaseGrid(wxWindow* parent, agi::Context *context, const wxSize& size, , batch_level(0) , batch_active_line_changed(false) , seek_listener(context->videoController->AddSeekListener(std::bind(&BaseGrid::Refresh, this, false, nullptr))) -, context_menu(0) , yPos(0) , context(context) { @@ -140,7 +139,6 @@ BaseGrid::BaseGrid(wxWindow* parent, agi::Context *context, const wxSize& size, BaseGrid::~BaseGrid() { ClearMaps(); - delete context_menu; } BEGIN_EVENT_TABLE(BaseGrid,wxWindow) @@ -759,7 +757,7 @@ void BaseGrid::OnContextMenu(wxContextMenuEvent &evt) { wxPoint pos = evt.GetPosition(); if (pos == wxDefaultPosition || ScreenToClient(pos).y > lineHeight) { if (!context_menu) context_menu = menu::GetMenu("grid_context", context); - menu::OpenPopupMenu(context_menu, this); + menu::OpenPopupMenu(context_menu.get(), this); } else { const wxString strings[] = { diff --git a/aegisub/src/base_grid.h b/aegisub/src/base_grid.h index 8f20cfbcd..090327f56 100644 --- a/aegisub/src/base_grid.h +++ b/aegisub/src/base_grid.h @@ -36,6 +36,7 @@ #pragma once #include +#include #include #include @@ -85,7 +86,7 @@ class BaseGrid : public wxWindow, public SubtitleSelectionController { agi::signal::Connection seek_listener; /// Cached grid body context menu - wxMenu *context_menu; + std::unique_ptr context_menu; void OnContextMenu(wxContextMenuEvent &evt); void OnHighlightVisibleChange(agi::OptionValue const& opt); diff --git a/aegisub/src/command/vis_tool.cpp b/aegisub/src/command/vis_tool.cpp index e222cd291..89047a36b 100644 --- a/aegisub/src/command/vis_tool.cpp +++ b/aegisub/src/command/vis_tool.cpp @@ -55,7 +55,7 @@ namespace { } void operator()(agi::Context *c) { - c->videoDisplay->SetTool(new T(c->videoDisplay, c)); + c->videoDisplay->SetTool(agi::util::make_unique(c->videoDisplay, c)); } }; diff --git a/aegisub/src/dialog_colorpicker.cpp b/aegisub/src/dialog_colorpicker.cpp index f99f7dc1f..1b56d235d 100644 --- a/aegisub/src/dialog_colorpicker.cpp +++ b/aegisub/src/dialog_colorpicker.cpp @@ -46,7 +46,9 @@ #include "utils.h" #include +#include +#include #include #include @@ -429,7 +431,7 @@ void ColorPickerScreenDropper::DropFromScreenXY(int x, int y) { class DialogColorPicker : public wxDialog { - agi::scoped_ptr persist; + std::unique_ptr persist; agi::Color cur_color; ///< Currently selected colour @@ -663,7 +665,7 @@ DialogColorPicker::DialogColorPicker(wxWindow *parent, agi::Color initial_color, SetSizerAndFit(main_sizer); - persist.reset(new PersistLocation(this, "Tool/Colour Picker")); + persist = agi::util::make_unique(this, "Tool/Colour Picker"); // Fill the controls int mode = OPT_GET("Tool/Colour Picker/Mode")->GetInt(); diff --git a/aegisub/src/dialog_detached_video.cpp b/aegisub/src/dialog_detached_video.cpp index 0291a2690..fd7fbde5d 100644 --- a/aegisub/src/dialog_detached_video.cpp +++ b/aegisub/src/dialog_detached_video.cpp @@ -45,6 +45,8 @@ #include "video_context.h" #include "video_display.h" +#include + #include #include @@ -79,7 +81,7 @@ DialogDetachedVideo::DialogDetachedVideo(agi::Context *context) videoBox->SetMinSize(wxSize(1,1)); SetMinSize(wxSize(1,1)); - persist.reset(new PersistLocation(this, "Video/Detached")); + persist = agi::util::make_unique(this, "Video/Detached"); int display_index = wxDisplay::GetFromWindow(this); // Ensure that the dialog is no larger than the screen diff --git a/aegisub/src/dialog_detached_video.h b/aegisub/src/dialog_detached_video.h index ff58af15a..b0933578a 100644 --- a/aegisub/src/dialog_detached_video.h +++ b/aegisub/src/dialog_detached_video.h @@ -32,9 +32,9 @@ /// @ingroup main_ui /// +#include #include -#include #include namespace agi { struct Context; } @@ -47,7 +47,7 @@ class DialogDetachedVideo : public wxDialog { VideoDisplay *old_display; wxWindow *old_slider; agi::signal::Connection video_open; - agi::scoped_ptr persist; + std::unique_ptr persist; void OnClose(wxCloseEvent &); /// Minimize event handler to hack around a wx bug diff --git a/aegisub/src/dialog_export.h b/aegisub/src/dialog_export.h index 1f08ae4fb..ee9def6a5 100644 --- a/aegisub/src/dialog_export.h +++ b/aegisub/src/dialog_export.h @@ -32,10 +32,9 @@ /// @ingroup export /// +#include #include -#include - class AssExporter; namespace agi { struct Context; } class wxCheckListBox; @@ -47,7 +46,7 @@ class DialogExport : public wxDialog { agi::Context *c; /// The export transform engine - agi::scoped_ptr exporter; + std::unique_ptr exporter; /// The description of the currently selected export filter wxTextCtrl *filter_description; diff --git a/aegisub/src/dialog_export_ebu3264.cpp b/aegisub/src/dialog_export_ebu3264.cpp index ca833977d..9c01d0413 100644 --- a/aegisub/src/dialog_export_ebu3264.cpp +++ b/aegisub/src/dialog_export_ebu3264.cpp @@ -28,6 +28,7 @@ #include "text_file_writer.h" #include +#include #include #include @@ -212,15 +213,16 @@ agi::vfr::Framerate EbuExportSettings::GetFramerate() const { } } -agi::charset::IconvWrapper *EbuExportSettings::GetTextEncoder() const { +std::unique_ptr EbuExportSettings::GetTextEncoder() const { + using namespace agi; switch (text_encoding) { - case iso6937_2: return new agi::charset::IconvWrapper("utf-8", "ISO-6937-2"); - case iso8859_5: return new agi::charset::IconvWrapper("utf-8", "ISO-8859-5"); - case iso8859_6: return new agi::charset::IconvWrapper("utf-8", "ISO-8859-6"); - case iso8859_7: return new agi::charset::IconvWrapper("utf-8", "ISO-8859-7"); - case iso8859_8: return new agi::charset::IconvWrapper("utf-8", "ISO-8859-8"); - case utf8: return new agi::charset::IconvWrapper("utf-8", "utf-8"); - default: return new agi::charset::IconvWrapper("utf-8", "ISO-8859-1"); + case iso6937_2: return util::make_unique("utf-8", "ISO-6937-2"); + case iso8859_5: return util::make_unique("utf-8", "ISO-8859-5"); + case iso8859_6: return util::make_unique("utf-8", "ISO-8859-6"); + case iso8859_7: return util::make_unique("utf-8", "ISO-8859-7"); + case iso8859_8: return util::make_unique("utf-8", "ISO-8859-8"); + case utf8: return util::make_unique("utf-8", "utf-8"); + default: return util::make_unique("utf-8", "ISO-8859-1"); } } diff --git a/aegisub/src/dialog_export_ebu3264.h b/aegisub/src/dialog_export_ebu3264.h index 853db28eb..dbc153362 100644 --- a/aegisub/src/dialog_export_ebu3264.h +++ b/aegisub/src/dialog_export_ebu3264.h @@ -19,10 +19,11 @@ /// @see dialog_export_ebu3264.cpp /// @ingroup subtitle_io export -#include - #include +#include +#include + namespace agi { namespace charset { class IconvWrapper; } } #pragma pack(push, 1) @@ -100,7 +101,7 @@ public: agi::vfr::Framerate GetFramerate() const; /// Get a charset encoder for the current text encoding - agi::charset::IconvWrapper *GetTextEncoder() const; + std::unique_ptr GetTextEncoder() const; /// Load saved export settings from options /// @param prefix Option name prefix diff --git a/aegisub/src/dialog_search_replace.h b/aegisub/src/dialog_search_replace.h index 5fe13c682..bed377c80 100644 --- a/aegisub/src/dialog_search_replace.h +++ b/aegisub/src/dialog_search_replace.h @@ -19,7 +19,7 @@ /// @ingroup secondary_ui /// -#include +#include #include @@ -30,7 +30,7 @@ class wxComboBox; class DialogSearchReplace : public wxDialog { agi::Context *c; - agi::scoped_ptr settings; + std::unique_ptr settings; bool has_replace; wxComboBox *find_edit; wxComboBox *replace_edit; diff --git a/aegisub/src/dialog_shift_times.h b/aegisub/src/dialog_shift_times.h index 06a4cc3c6..6bb78597d 100644 --- a/aegisub/src/dialog_shift_times.h +++ b/aegisub/src/dialog_shift_times.h @@ -22,12 +22,12 @@ #include "selection_controller.h" #include -#include #include #include #include #include +#include #include @@ -44,10 +44,11 @@ namespace json { } class DialogShiftTimes : public wxDialog { + wxDECLARE_NO_COPY_CLASS(DialogShiftTimes); // clang + libc++ herps a derp without this agi::Context *context; agi::fs::path history_filename; - agi::scoped_ptr history; + std::unique_ptr history; agi::vfr::Framerate fps; agi::signal::Connection timecodes_loaded_slot; agi::signal::Connection selected_set_changed_slot; diff --git a/aegisub/src/dialog_style_editor.cpp b/aegisub/src/dialog_style_editor.cpp index f1bf367a3..fa5505681 100644 --- a/aegisub/src/dialog_style_editor.cpp +++ b/aegisub/src/dialog_style_editor.cpp @@ -34,14 +34,6 @@ #include "config.h" -#include - -#include -#include -#include -#include -#include - #include "ass_dialogue.h" #include "ass_file.h" #include "ass_style.h" @@ -61,6 +53,15 @@ #include "validators.h" #include +#include + +#include + +#include +#include +#include +#include +#include /// Style rename helper that walks a file searching for a style and optionally /// updating references to it @@ -156,7 +157,7 @@ DialogStyleEditor::DialogStyleEditor(wxWindow *parent, AssStyle *style, agi::Con style = this->style = new AssStyle; } - work.reset(new AssStyle(*style)); + work = agi::util::make_unique(*style); SetIcon(GETICON(style_toolbutton_16)); @@ -375,7 +376,7 @@ DialogStyleEditor::DialogStyleEditor(wxWindow *parent, AssStyle *style, agi::Con StyleName->SetInsertionPoint(0); StyleName->SetInsertionPoint(-1); - persist.reset(new PersistLocation(this, "Tool/Style Editor", true)); + persist = agi::util::make_unique(this, "Tool/Style Editor", true); Bind(wxEVT_CHILD_FOCUS, &DialogStyleEditor::OnChildFocus, this); diff --git a/aegisub/src/dialog_style_editor.h b/aegisub/src/dialog_style_editor.h index b80baf00d..f29d9dad9 100644 --- a/aegisub/src/dialog_style_editor.h +++ b/aegisub/src/dialog_style_editor.h @@ -32,14 +32,14 @@ /// @ingroup style_editor /// +#include + #include #include #include #include #include -#include - namespace agi { struct Context; } class AssStyle; class AssStyleStorage; @@ -49,7 +49,7 @@ class SubtitlesPreview; class DialogStyleEditor : public wxDialog { agi::Context *c; - agi::scoped_ptr persist; + std::unique_ptr persist; /// If true, the style was just created and so the user should not be /// asked if they want to change any existing lines should they rename @@ -61,7 +61,7 @@ class DialogStyleEditor : public wxDialog { /// Copy of style passed to the subtitles preview to avoid making changes /// before Apply is clicked - agi::scoped_ptr work; + std::unique_ptr work; /// The style storage style is in, if applicable AssStyleStorage *store; diff --git a/aegisub/src/dialog_style_manager.cpp b/aegisub/src/dialog_style_manager.cpp index c112c0a1e..4a9493fe8 100644 --- a/aegisub/src/dialog_style_manager.cpp +++ b/aegisub/src/dialog_style_manager.cpp @@ -220,7 +220,7 @@ DialogStyleManager::DialogStyleManager(agi::Context *context) SetSizerAndFit(MainSizer); // Position window - persist.reset(new PersistLocation(this, "Tool/Style Manager")); + persist = agi::util::make_unique(this, "Tool/Style Manager"); // Populate lists LoadCatalog(); diff --git a/aegisub/src/dialog_style_manager.h b/aegisub/src/dialog_style_manager.h index b38f63e01..7a3e407e5 100644 --- a/aegisub/src/dialog_style_manager.h +++ b/aegisub/src/dialog_style_manager.h @@ -32,6 +32,7 @@ /// @ingroup style_editor /// +#include #include #include @@ -39,7 +40,6 @@ #include #include -#include #include #include "ass_style_storage.h" @@ -53,7 +53,7 @@ class PersistLocation; class DialogStyleManager : public wxDialog { agi::Context *c; ///< Project context - agi::scoped_ptr persist; + std::unique_ptr persist; agi::signal::Connection commit_connection; agi::signal::Connection active_line_connection; diff --git a/aegisub/src/dialog_styling_assistant.cpp b/aegisub/src/dialog_styling_assistant.cpp index 00a0f8a19..df001e371 100644 --- a/aegisub/src/dialog_styling_assistant.cpp +++ b/aegisub/src/dialog_styling_assistant.cpp @@ -19,7 +19,6 @@ /// @ingroup tools_ui /// - #include "config.h" #include "dialog_styling_assistant.h" @@ -38,6 +37,8 @@ #include "persist_location.h" #include "video_context.h" +#include + #include #include #include @@ -136,7 +137,7 @@ DialogStyling::DialogStyling(agi::Context *context) SetSizerAndFit(main_sizer); - persist.reset(new PersistLocation(this, "Tool/Styling Assistant")); + persist = agi::util::make_unique(this, "Tool/Styling Assistant"); Bind(wxEVT_ACTIVATE, &DialogStyling::OnActivate, this); Bind(wxEVT_CHAR_HOOK, &DialogStyling::OnCharHook, this); diff --git a/aegisub/src/dialog_styling_assistant.h b/aegisub/src/dialog_styling_assistant.h index 5fa267f53..5fbe5d729 100644 --- a/aegisub/src/dialog_styling_assistant.h +++ b/aegisub/src/dialog_styling_assistant.h @@ -21,11 +21,10 @@ #include "selection_controller.h" +#include #include #include -#include - namespace agi { struct Context; } class AssDialogue; class PersistLocation; @@ -58,7 +57,7 @@ class DialogStyling : public wxDialog { AssDialogue *active_line; - agi::scoped_ptr persist; + std::unique_ptr persist; public: void Commit(bool next); diff --git a/aegisub/src/dialog_translation.cpp b/aegisub/src/dialog_translation.cpp index 5b732fb55..3b30916d7 100644 --- a/aegisub/src/dialog_translation.cpp +++ b/aegisub/src/dialog_translation.cpp @@ -39,6 +39,8 @@ #include "utils.h" #include "video_context.h" +#include + #include #include @@ -152,7 +154,7 @@ DialogTranslation::DialogTranslation(agi::Context *c) SetSizerAndFit(main_sizer); - persist.reset(new PersistLocation(this, "Tool/Translation Assistant")); + persist = agi::util::make_unique(this, "Tool/Translation Assistant"); Bind(wxEVT_KEY_DOWN, &DialogTranslation::OnKeyDown, this); diff --git a/aegisub/src/dialog_translation.h b/aegisub/src/dialog_translation.h index 1ea962a5d..0a3064385 100644 --- a/aegisub/src/dialog_translation.h +++ b/aegisub/src/dialog_translation.h @@ -21,10 +21,10 @@ #include #include -#include #include #include +#include namespace agi { struct Context; } class AssDialogue; @@ -62,7 +62,7 @@ class DialogTranslation : public wxDialog { SubsTextEditCtrl *translated_text; wxCheckBox *seek_video; - agi::scoped_ptr persist; + std::unique_ptr persist; void OnPlayAudioButton(wxCommandEvent &); void OnPlayVideoButton(wxCommandEvent &); diff --git a/aegisub/src/hotkey_data_view_model.h b/aegisub/src/hotkey_data_view_model.h index b073ec28c..2a712450e 100644 --- a/aegisub/src/hotkey_data_view_model.h +++ b/aegisub/src/hotkey_data_view_model.h @@ -19,10 +19,9 @@ /// @ingroup hotkey configuration_ui /// +#include #include -#include - class HotkeyModelItem; class HotkeyModelRoot; class Preferences; @@ -30,7 +29,7 @@ class Preferences; /// @class HotkeyDataViewModel /// @brief A wxDataViewModel for hotkeys class HotkeyDataViewModel : public wxDataViewModel { - agi::scoped_ptr root; + std::unique_ptr root; Preferences *parent; bool has_pending_changes; diff --git a/aegisub/src/include/aegisub/menu.h b/aegisub/src/include/aegisub/menu.h index 510a2701f..b3b784efb 100644 --- a/aegisub/src/include/aegisub/menu.h +++ b/aegisub/src/include/aegisub/menu.h @@ -16,6 +16,7 @@ /// @brief Dynamic menu and toolbar generator. /// @ingroup menu toolbar +#include #include #include @@ -46,7 +47,7 @@ namespace menu { /// Throws: /// UnknownMenu if no menu with the given name was found /// BadMenu if there is a menu with the given name, but it is invalid - wxMenu *GetMenu(std::string const& name, agi::Context *c); + std::unique_ptr GetMenu(std::string const& name, agi::Context *c); /// @brief Open a popup menu at the mouse /// @param menu Menu to open diff --git a/aegisub/src/menu.cpp b/aegisub/src/menu.cpp index 053359ff4..ede34db56 100644 --- a/aegisub/src/menu.cpp +++ b/aegisub/src/menu.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -437,7 +438,7 @@ namespace menu { void GetMenuBar(std::string const& name, wxFrame *window, agi::Context *c) { menu_items const& items = get_menu(name); - std::unique_ptr menu(new CommandMenuBar(c)); + auto menu = agi::util::make_unique(c); for (auto const& item : items) { std::string submenu, disp; read_entry(item, "submenu", &submenu); @@ -475,12 +476,12 @@ namespace menu { menu.release(); } - wxMenu *GetMenu(std::string const& name, agi::Context *c) { + std::unique_ptr GetMenu(std::string const& name, agi::Context *c) { CommandMenu *menu = new CommandMenu(c); build_menu(name, c, &menu->cm, menu); menu->Bind(wxEVT_MENU_OPEN, &CommandManager::OnMenuOpen, &menu->cm); menu->Bind(wxEVT_COMMAND_MENU_SELECTED, &CommandManager::OnMenuClick, &menu->cm); - return menu; + return std::unique_ptr(menu); } void OpenPopupMenu(wxMenu *menu, wxWindow *parent_window) { diff --git a/aegisub/src/subs_edit_box.cpp b/aegisub/src/subs_edit_box.cpp index bcb79420c..82cf76e55 100644 --- a/aegisub/src/subs_edit_box.cpp +++ b/aegisub/src/subs_edit_box.cpp @@ -57,6 +57,7 @@ #include #include +#include #include #include @@ -218,7 +219,7 @@ SubsEditBox::SubsEditBox(wxWindow *parent, agi::Context *context) connections.push_back(context->selectionController->AddSelectionListener(&SubsEditBox::OnSelectedSetChanged, this)); connections.push_back(context->initialLineState->AddChangeListener(&SubsEditBox::OnLineInitialTextChanged, this)); - textSelectionController.reset(new ScintillaTextSelectionController(edit_ctrl)); + textSelectionController = agi::util::make_unique(edit_ctrl); context->textSelectionController = textSelectionController.get(); edit_ctrl->SetFocus(); } diff --git a/aegisub/src/subs_edit_box.h b/aegisub/src/subs_edit_box.h index f92202d1a..b46fd1128 100644 --- a/aegisub/src/subs_edit_box.h +++ b/aegisub/src/subs_edit_box.h @@ -36,13 +36,13 @@ #include #include #include +#include #include #include #include #include -#include #include #include "selection_controller.h" @@ -200,7 +200,7 @@ class SubsEditBox : public wxPanel { SubsTextEditCtrl *edit_ctrl; wxTextCtrl *secondary_editor; - agi::scoped_ptr textSelectionController; + std::unique_ptr textSelectionController; public: /// @brief Constructor diff --git a/aegisub/src/subtitle_format_ebu3264.cpp b/aegisub/src/subtitle_format_ebu3264.cpp index 908ce4f51..964e3443c 100644 --- a/aegisub/src/subtitle_format_ebu3264.cpp +++ b/aegisub/src/subtitle_format_ebu3264.cpp @@ -25,13 +25,6 @@ #include "subtitle_format_ebu3264.h" -#include -#include -#include -#include -#include -#include - #include "aegisub_endian.h" #include "ass_dialogue.h" #include "ass_file.h" @@ -41,6 +34,12 @@ #include "options.h" #include "text_file_writer.h" +#include +#include +#include +#include +#include + #include namespace @@ -469,8 +468,8 @@ namespace std::vector create_blocks(std::vector const& subs_list, EbuExportSettings const& export_settings) { - agi::scoped_ptr encoder(export_settings.GetTextEncoder()); - agi::vfr::Framerate fps = export_settings.GetFramerate(); + auto encoder = export_settings.GetTextEncoder(); + auto fps = export_settings.GetFramerate(); // Teletext captions are 1-23; Open subtitles are 0-99 uint8_t min_row = 0; diff --git a/aegisub/src/video_display.cpp b/aegisub/src/video_display.cpp index d86009bf9..6b17f3638 100644 --- a/aegisub/src/video_display.cpp +++ b/aegisub/src/video_display.cpp @@ -34,21 +34,6 @@ #include "config.h" -#include - -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_OPENGL_GL_H -#include -#else -#include -#endif - #include "video_display.h" #include "ass_file.h" @@ -67,6 +52,23 @@ #include "video_frame.h" #include "visual_tool.h" +#include + +#include + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_OPENGL_GL_H +#include +#else +#include +#endif + /// Attribute list for gl canvases; set the canvases to doublebuffered rgba with an 8 bit stencil buffer int attribList[] = { WX_GL_RGBA , WX_GL_DOUBLEBUFFER, WX_GL_STENCIL_SIZE, 8, 0 }; @@ -147,9 +149,9 @@ bool VideoDisplay::InitContext() { return false; if (!glContext) - glContext.reset(new wxGLContext(this)); + glContext = agi::util::make_unique(this); - SetCurrent(*glContext.get()); + SetCurrent(*glContext); return true; } @@ -163,7 +165,7 @@ void VideoDisplay::Render() try { return; if (!videoOut) - videoOut.reset(new VideoOutGL); + videoOut = agi::util::make_unique(); if (!tool) cmd::call("video/tool/cross", con); @@ -369,7 +371,7 @@ void VideoDisplay::OnMouseWheel(wxMouseEvent& event) { } void VideoDisplay::OnContextMenu(wxContextMenuEvent&) { - if (!context_menu.get()) context_menu.reset(menu::GetMenu("video_context", con)); + if (!context_menu.get()) context_menu = menu::GetMenu("video_context", con); SetCursor(wxNullCursor); menu::OpenPopupMenu(context_menu.get(), this); } @@ -405,12 +407,12 @@ void VideoDisplay::SetZoomFromBoxText(wxCommandEvent &) { SetZoom(value / 100.); } -void VideoDisplay::SetTool(VisualToolBase *new_tool) { +void VideoDisplay::SetTool(std::unique_ptr&& new_tool) { toolBar->ClearTools(); toolBar->Realize(); toolBar->Show(false); - tool.reset(new_tool); + tool = std::move(new_tool); tool->SetToolbar(toolBar); // Update size as the new typesetting tool may have changed the subtoolbar size diff --git a/aegisub/src/video_display.h b/aegisub/src/video_display.h index 9f9bb7865..36dc79b5c 100644 --- a/aegisub/src/video_display.h +++ b/aegisub/src/video_display.h @@ -32,19 +32,15 @@ /// @ingroup video main_ui /// - -#include -#include - -#include - -#include - -#include #include #include "vector2d.h" +#include +#include +#include +#include + // Prototypes class AegiVideoFrame; struct FrameReadyEvent; @@ -68,7 +64,7 @@ class VideoDisplay : public wxGLCanvas { agi::Context *con; - agi::scoped_ptr context_menu; + std::unique_ptr context_menu; /// The size of the video in screen at the current zoom level, which may not /// be the same as the actual client size of the display @@ -91,15 +87,15 @@ class VideoDisplay : public wxGLCanvas { double zoomValue; /// The video renderer - agi::scoped_ptr videoOut; + std::unique_ptr videoOut; /// The active visual typesetting tool - agi::scoped_ptr tool; + std::unique_ptr tool; /// The toolbar used by individual typesetting tools wxToolBar* toolBar; /// The OpenGL context for this display - agi::scoped_ptr glContext; + std::unique_ptr glContext; /// The dropdown box for selecting zoom levels wxComboBox *zoomBox; @@ -164,7 +160,7 @@ public: /// Get the last seen position of the mouse in script coordinates Vector2D GetMousePosition() const; - void SetTool(VisualToolBase *new_tool); + void SetTool(std::unique_ptr&& new_tool); bool ToolIsType(std::type_info const& type) const; diff --git a/aegisub/src/visual_tool_cross.h b/aegisub/src/visual_tool_cross.h index 9579dd03d..922c47b1d 100644 --- a/aegisub/src/visual_tool_cross.h +++ b/aegisub/src/visual_tool_cross.h @@ -19,18 +19,18 @@ /// @ingroup visual_ts /// -#include - #include "visual_feature.h" #include "visual_tool.h" +#include + class OpenGLText; /// @class VisualToolCross /// @brief A crosshair which shows the current mouse position and on double-click /// shifts the selected lines to the clicked point class VisualToolCross : public VisualTool { - agi::scoped_ptr gl_text; + std::unique_ptr gl_text; void OnDoubleClick(); void Draw();