fix noexcept marking on entry, and make move assignment

This commit is contained in:
arvidn 2018-01-04 21:02:34 +01:00 committed by Arvid Norberg
parent d635667375
commit fac9931eb6
3 changed files with 32 additions and 11 deletions

View File

@ -32,6 +32,8 @@ POSSIBILITY OF SUCH DAMAGE.
#ifndef TORRENT_NOEXCEPT_MOVABLE_HPP_INCLUDED #ifndef TORRENT_NOEXCEPT_MOVABLE_HPP_INCLUDED
#define TORRENT_NOEXCEPT_MOVABLE_HPP_INCLUDED #define TORRENT_NOEXCEPT_MOVABLE_HPP_INCLUDED
#include <type_traits>
namespace libtorrent { namespace libtorrent {
namespace aux { namespace aux {
@ -42,7 +44,7 @@ namespace aux {
template <typename T> template <typename T>
struct noexcept_movable : T struct noexcept_movable : T
{ {
noexcept_movable() noexcept {} noexcept_movable() noexcept(std::is_nothrow_default_constructible<T>::value) {}
noexcept_movable(noexcept_movable<T>&& rhs) noexcept noexcept_movable(noexcept_movable<T>&& rhs) noexcept
: T(std::forward<T>(rhs)) : T(std::forward<T>(rhs))
{} {}

View File

@ -274,7 +274,7 @@ namespace aux {
const preformatted_type& preformatted() const; const preformatted_type& preformatted() const;
// swaps the content of *this* with ``e``. // swaps the content of *this* with ``e``.
void swap(entry& e) noexcept; void swap(entry& e);
// All of these functions requires the entry to be a dictionary, if it // All of these functions requires the entry to be a dictionary, if it
// isn't they will throw ``system_error``. // isn't they will throw ``system_error``.

View File

@ -143,7 +143,32 @@ namespace {
entry& entry::operator=(entry&& e) noexcept entry& entry::operator=(entry&& e) noexcept
{ {
if (&e == this) return *this; if (&e == this) return *this;
swap(e); destruct();
const auto t = e.type();
switch (t)
{
case int_t:
new (&data) integer_type(std::move(e.integer()));
break;
case string_t:
new (&data) string_type(std::move(e.string()));
break;
case list_t:
new (&data) list_type(std::move(e.list()));
break;
case dictionary_t:
new (&data) dictionary_type(std::move(e.dict()));
break;
case undefined_t:
break;
case preformatted_t:
new (&data) preformatted_type(std::move(e.preformatted()));
break;
}
m_type = t;
#if TORRENT_USE_ASSERTS
m_type_queried = true;
#endif
return *this; return *this;
} }
@ -281,13 +306,7 @@ namespace {
entry::entry(entry&& e) noexcept entry::entry(entry&& e) noexcept
: m_type(undefined_t) : m_type(undefined_t)
{ {
#if TORRENT_USE_ASSERTS this->operator=(std::move(e));
uint8_t type_queried = e.m_type_queried;
#endif
swap(e);
#if TORRENT_USE_ASSERTS
m_type_queried = type_queried;
#endif
} }
entry::entry(dictionary_type v) entry::entry(dictionary_type v)
@ -581,7 +600,7 @@ namespace {
#endif #endif
} }
void entry::swap(entry& e) noexcept void entry::swap(entry& e)
{ {
bool clear_this = false; bool clear_this = false;
bool clear_that = false; bool clear_that = false;