add some noexcept and assume std::function is not nothrow move constructible on clang

This commit is contained in:
Arvid Norberg 2018-08-20 15:20:16 +02:00 committed by Arvid Norberg
parent 37d85ac2f7
commit 11a8f46921
3 changed files with 28 additions and 29 deletions

View File

@ -175,11 +175,7 @@ TORRENT_VERSION_NAMESPACE_2
// or encrypt the content on disk for instance. For more information // or encrypt the content on disk for instance. For more information
// about the storage_interface that needs to be implemented for a custom // about the storage_interface that needs to be implemented for a custom
// storage, see storage_interface. // storage, see storage_interface.
#ifdef __clang__
storage_constructor_type storage;
#else
aux::noexcept_movable<storage_constructor_type> storage; aux::noexcept_movable<storage_constructor_type> storage;
#endif
// The ``userdata`` parameter is optional and will be passed on to the // The ``userdata`` parameter is optional and will be passed on to the
// extension constructor functions, if any // extension constructor functions, if any

View File

@ -77,10 +77,10 @@ namespace libtorrent {
} }
// query bit at ``index``. Returns true if bit is 1, otherwise false. // query bit at ``index``. Returns true if bit is 1, otherwise false.
bool operator[](int index) const bool operator[](int index) const noexcept
{ return get_bit(index); } { return get_bit(index); }
bool get_bit(int index) const bool get_bit(int index) const noexcept
{ {
TORRENT_ASSERT(index >= 0); TORRENT_ASSERT(index >= 0);
TORRENT_ASSERT(index < size()); TORRENT_ASSERT(index < size());
@ -88,13 +88,13 @@ namespace libtorrent {
} }
// set bit at ``index`` to 0 (clear_bit) or 1 (set_bit). // set bit at ``index`` to 0 (clear_bit) or 1 (set_bit).
void clear_bit(int index) void clear_bit(int index) noexcept
{ {
TORRENT_ASSERT(index >= 0); TORRENT_ASSERT(index >= 0);
TORRENT_ASSERT(index < size()); TORRENT_ASSERT(index < size());
buf()[index / 32] &= aux::host_to_network(~(0x80000000 >> (index & 31))); buf()[index / 32] &= aux::host_to_network(~(0x80000000 >> (index & 31)));
} }
void set_bit(int index) void set_bit(int index) noexcept
{ {
TORRENT_ASSERT(index >= 0); TORRENT_ASSERT(index >= 0);
TORRENT_ASSERT(index < size()); TORRENT_ASSERT(index < size());
@ -125,17 +125,17 @@ namespace libtorrent {
return bits; return bits;
} }
int num_words() const int num_words() const noexcept
{ {
return (size() + 31) / 32; return (size() + 31) / 32;
} }
// returns true if the bitfield has zero size. // returns true if the bitfield has zero size.
bool empty() const { return size() == 0; } bool empty() const noexcept { return size() == 0; }
// returns a pointer to the internal buffer of the bitfield. // returns a pointer to the internal buffer of the bitfield.
char const* data() const { return m_buf ? reinterpret_cast<char const*>(&m_buf[1]) : nullptr; } char const* data() const noexcept { return m_buf ? reinterpret_cast<char const*>(&m_buf[1]) : nullptr; }
char* data() { return m_buf ? reinterpret_cast<char*>(&m_buf[1]) : nullptr; } char* data() noexcept { return m_buf ? reinterpret_cast<char*>(&m_buf[1]) : nullptr; }
#if TORRENT_ABI_VERSION == 1 #if TORRENT_ABI_VERSION == 1
TORRENT_DEPRECATED TORRENT_DEPRECATED
@ -151,7 +151,7 @@ namespace libtorrent {
bitfield& operator=(bitfield&& rhs) noexcept = default; bitfield& operator=(bitfield&& rhs) noexcept = default;
void swap(bitfield& rhs) void swap(bitfield& rhs) noexcept
{ {
std::swap(m_buf, rhs.m_buf); std::swap(m_buf, rhs.m_buf);
} }
@ -171,19 +171,19 @@ namespace libtorrent {
using reference = bool&; using reference = bool&;
using iterator_category = std::forward_iterator_tag; using iterator_category = std::forward_iterator_tag;
bool operator*() { return (*buf & aux::host_to_network(bit)) != 0; } bool operator*() noexcept { return (*buf & aux::host_to_network(bit)) != 0; }
const_iterator& operator++() { inc(); return *this; } const_iterator& operator++() noexcept { inc(); return *this; }
const_iterator operator++(int) const_iterator operator++(int) noexcept
{ const_iterator ret(*this); inc(); return ret; } { const_iterator ret(*this); inc(); return ret; }
const_iterator& operator--() { dec(); return *this; } const_iterator& operator--() noexcept { dec(); return *this; }
const_iterator operator--(int) const_iterator operator--(int) noexcept
{ const_iterator ret(*this); dec(); return ret; } { const_iterator ret(*this); dec(); return ret; }
const_iterator() {} const_iterator() noexcept {}
bool operator==(const_iterator const& rhs) const bool operator==(const_iterator const& rhs) const noexcept
{ return buf == rhs.buf && bit == rhs.bit; } { return buf == rhs.buf && bit == rhs.bit; }
bool operator!=(const_iterator const& rhs) const bool operator!=(const_iterator const& rhs) const noexcept
{ return buf != rhs.buf || bit != rhs.bit; } { return buf != rhs.buf || bit != rhs.bit; }
private: private:
@ -219,8 +219,8 @@ namespace libtorrent {
std::uint32_t bit = 0x80000000; std::uint32_t bit = 0x80000000;
}; };
const_iterator begin() const { return const_iterator(m_buf ? buf() : nullptr, 0); } const_iterator begin() const noexcept { return const_iterator(m_buf ? buf() : nullptr, 0); }
const_iterator end() const { return const_iterator( const_iterator end() const noexcept { return const_iterator(
m_buf ? buf() + num_words() - (((size() & 31) == 0) ? 0 : 1) : nullptr, size() & 31); } m_buf ? buf() + num_words() - (((size() & 31) == 0) ? 0 : 1) : nullptr, size() & 31); }
// set the size of the bitfield to ``bits`` length. If the bitfield is extended, // set the size of the bitfield to ``bits`` length. If the bitfield is extended,
@ -229,26 +229,26 @@ namespace libtorrent {
void resize(int bits); void resize(int bits);
// set all bits in the bitfield to 1 (set_all) or 0 (clear_all). // set all bits in the bitfield to 1 (set_all) or 0 (clear_all).
void set_all() void set_all() noexcept
{ {
if (size() == 0) return; if (size() == 0) return;
std::memset(buf(), 0xff, std::size_t(num_words() * 4)); std::memset(buf(), 0xff, std::size_t(num_words() * 4));
clear_trailing_bits(); clear_trailing_bits();
} }
void clear_all() void clear_all() noexcept
{ {
if (size() == 0) return; if (size() == 0) return;
std::memset(buf(), 0x00, std::size_t(num_words() * 4)); std::memset(buf(), 0x00, std::size_t(num_words() * 4));
} }
// make the bitfield empty, of zero size. // make the bitfield empty, of zero size.
void clear() { m_buf.reset(); } void clear() noexcept { m_buf.reset(); }
private: private:
std::uint32_t const* buf() const { TORRENT_ASSERT(m_buf); return &m_buf[1]; } std::uint32_t const* buf() const noexcept { TORRENT_ASSERT(m_buf); return &m_buf[1]; }
std::uint32_t* buf() { TORRENT_ASSERT(m_buf); return &m_buf[1]; } std::uint32_t* buf() noexcept { TORRENT_ASSERT(m_buf); return &m_buf[1]; }
void clear_trailing_bits() void clear_trailing_bits() noexcept
{ {
// clear the tail bits in the last byte // clear the tail bits in the last byte
if (size() & 31) buf()[num_words() - 1] &= aux::host_to_network(0xffffffff << (32 - (size() & 31))); if (size() & 31) buf()[num_words() - 1] &= aux::host_to_network(0xffffffff << (32 - (size() & 31)));

View File

@ -70,6 +70,9 @@ namespace libtorrent {
static_assert(std::is_nothrow_move_constructible<add_torrent_params>::value static_assert(std::is_nothrow_move_constructible<add_torrent_params>::value
, "should be nothrow move constructible"); , "should be nothrow move constructible");
static_assert(std::is_nothrow_move_constructible<std::string>::value
, "should be nothrow move constructible");
// TODO: pre C++17, GCC and msvc does not make std::string nothrow move // TODO: pre C++17, GCC and msvc does not make std::string nothrow move
// assignable, which means no type containing a string will be nothrow move // assignable, which means no type containing a string will be nothrow move
// assignable by default either // assignable by default either