diff --git a/src/emitterstate.cpp b/src/emitterstate.cpp index 469040f..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) @@ -136,7 +139,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 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(); } diff --git a/src/setting.h b/src/setting.h index 508193e..b78d40e 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; - rhs.m_settingChanges.clear(); + std::swap(m_settingChanges, rhs.m_settingChanges); + return *this; } private: - typedef std::vector setting_changes; + typedef std::vector> setting_changes; setting_changes m_settingChanges; }; }