From 398ec19e817d65f80402e296b395994e01cb67ff Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 3 Jul 2015 15:09:58 +0200 Subject: [PATCH 1/4] convert ptr_stack to unique_ptr --- src/emitterstate.cpp | 2 +- src/ptr_stack.h | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/emitterstate.cpp b/src/emitterstate.cpp index 469040f..3ea5570 100644 --- a/src/emitterstate.cpp +++ b/src/emitterstate.cpp @@ -136,7 +136,7 @@ void EmitterState::StartedGroup(GroupType::value type) { pGroup->flowType = FlowType::Flow; pGroup->indent = GetIndent(); - m_groups.push(pGroup); + m_groups.push(std::move(pGroup)); } void EmitterState::EndedGroup(GroupType::value type) { diff --git a/src/ptr_stack.h b/src/ptr_stack.h index 3757432..7767813 100644 --- a/src/ptr_stack.h +++ b/src/ptr_stack.h @@ -18,36 +18,40 @@ template class ptr_stack : private YAML::noncopyable { public: ptr_stack() {} - ~ptr_stack() { clear(); } void clear() { - for (std::size_t i = 0; i < m_data.size(); i++) - delete m_data[i]; m_data.clear(); } std::size_t size() const { return m_data.size(); } bool empty() const { return m_data.empty(); } - void push(std::unique_ptr &t) { - m_data.push_back(NULL); - m_data.back() = t.release(); + void push(std::unique_ptr&& t) { + m_data.push_back(std::move(t)); } std::unique_ptr pop() { - std::unique_ptr t(m_data.back()); + std::unique_ptr t(std::move(m_data.back())); m_data.pop_back(); return t; } - T& top() { return *m_data.back(); } - const T& top() const { return *m_data.back(); } - T& top(std::ptrdiff_t diff) { return **(m_data.end() - 1 + diff); } + T& top() { + return *(m_data.back().get()); + } + const T& top() const { + return *(m_data.back().get()); + } + + T& top(std::ptrdiff_t diff) { + return *((m_data.end() - 1 + diff)->get()); + } + const T& top(std::ptrdiff_t diff) const { - return **(m_data.end() - 1 + diff); + return *((m_data.end() - 1 + diff)->get()); } private: - std::vector m_data; + std::vector> m_data; }; #endif // PTR_STACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 From e32999b5995094fd98a063b0a2be6a3eb8e3b788 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 3 Jul 2015 15:10:07 +0200 Subject: [PATCH 2/4] convert ptr_vector to unique_ptr --- src/ptr_vector.h | 19 ++++++++++--------- src/scanner.cpp | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/ptr_vector.h b/src/ptr_vector.h index de4f8c4..b592ccd 100644 --- a/src/ptr_vector.h +++ b/src/ptr_vector.h @@ -20,29 +20,30 @@ template class ptr_vector : private YAML::noncopyable { public: ptr_vector() {} - ~ptr_vector() { clear(); } void clear() { - for (std::size_t i = 0; i < m_data.size(); i++) - delete m_data[i]; m_data.clear(); } std::size_t size() const { return m_data.size(); } bool empty() const { return m_data.empty(); } - void push_back(std::unique_ptr &t) { - m_data.push_back(NULL); - m_data.back() = t.release(); + void push_back(std::unique_ptr&& t) { + m_data.push_back(std::move(t)); } T& operator[](std::size_t i) { return *m_data[i]; } const T& operator[](std::size_t i) const { return *m_data[i]; } - T& back() { return *m_data.back(); } - const T& back() const { return *m_data.back(); } + T& back() { + return *(m_data.back().get()); + } + + const T& back() const { + return *(m_data.back().get()); + } private: - std::vector m_data; + std::vector> m_data; }; } diff --git a/src/scanner.cpp b/src/scanner.cpp index f89ed9b..767b8e1 100644 --- a/src/scanner.cpp +++ b/src/scanner.cpp @@ -234,7 +234,7 @@ void Scanner::StartStream() { m_startedStream = true; m_simpleKeyAllowed = true; std::unique_ptr pIndent(new IndentMarker(-1, IndentMarker::NONE)); - m_indentRefs.push_back(pIndent); + m_indentRefs.push_back(std::move(pIndent)); m_indents.push(&m_indentRefs.back()); } @@ -298,7 +298,7 @@ Scanner::IndentMarker* Scanner::PushIndentTo(int column, // and then the indent m_indents.push(&indent); - m_indentRefs.push_back(pIndent); + m_indentRefs.push_back(std::move(pIndent)); return &m_indentRefs.back(); } From a7c6cdcbc166966db05a568fcf1840a9c3d671cb Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 3 Jul 2015 15:22:56 +0200 Subject: [PATCH 3/4] use unique_ptr in SettingChanges --- src/emitterstate.cpp | 5 ++++- src/setting.h | 12 ++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/emitterstate.cpp b/src/emitterstate.cpp index 3ea5570..124dc1c 100644 --- a/src/emitterstate.cpp +++ b/src/emitterstate.cpp @@ -127,7 +127,10 @@ void EmitterState::StartedGroup(GroupType::value type) { std::unique_ptr pGroup(new Group(type)); // transfer settings (which last until this group is done) - pGroup->modifiedSettings = m_modifiedSettings; + // + // NB: if pGroup->modifiedSettings == m_modifiedSettings, + // m_modifiedSettings is not changed! + pGroup->modifiedSettings = std::move(m_modifiedSettings); // set up group if (GetFlowType(type) == Block) diff --git a/src/setting.h b/src/setting.h index 508193e..5f09d1d 100644 --- a/src/setting.h +++ b/src/setting.h @@ -62,10 +62,6 @@ class SettingChanges : private noncopyable { void clear() { restore(); - - for (setting_changes::const_iterator it = m_settingChanges.begin(); - it != m_settingChanges.end(); ++it) - delete *it; m_settingChanges.clear(); } @@ -76,22 +72,22 @@ class SettingChanges : private noncopyable { } void push(std::unique_ptr pSettingChange) { - m_settingChanges.push_back(pSettingChange.release()); + m_settingChanges.push_back(std::move(pSettingChange)); } // like std::unique_ptr - assignment is transfer of ownership - SettingChanges& operator=(SettingChanges& rhs) { + SettingChanges& operator=(SettingChanges&& rhs) { if (this == &rhs) return *this; clear(); - m_settingChanges = rhs.m_settingChanges; + m_settingChanges = std::move(rhs.m_settingChanges); rhs.m_settingChanges.clear(); return *this; } private: - typedef std::vector setting_changes; + typedef std::vector> setting_changes; setting_changes m_settingChanges; }; } From efbb4c20f6124aa19f3dd9f6f0cea1d9faee8ef5 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 3 Jul 2015 15:37:55 +0200 Subject: [PATCH 4/4] swap cleared settings vector --- src/setting.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/setting.h b/src/setting.h index 5f09d1d..b78d40e 100644 --- a/src/setting.h +++ b/src/setting.h @@ -81,8 +81,8 @@ class SettingChanges : private noncopyable { return *this; clear(); - m_settingChanges = std::move(rhs.m_settingChanges); - rhs.m_settingChanges.clear(); + std::swap(m_settingChanges, rhs.m_settingChanges); + return *this; }