diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f1e53efe..4c45d33f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,6 +123,7 @@ set(sources xml_parse version ffs + add_torrent_params # -- extensions -- ut_pex diff --git a/Jamfile b/Jamfile index c6ab85598..000a1adee 100644 --- a/Jamfile +++ b/Jamfile @@ -666,6 +666,7 @@ SOURCES = proxy_settings file_progress ffs + add_torrent_params # -- extensions -- ut_pex diff --git a/include/libtorrent/add_torrent_params.hpp b/include/libtorrent/add_torrent_params.hpp index ee2342f23..1d7816bac 100644 --- a/include/libtorrent/add_torrent_params.hpp +++ b/include/libtorrent/add_torrent_params.hpp @@ -85,12 +85,12 @@ namespace libtorrent { // The constructor can be used to initialize the storage constructor, // which determines the storage mechanism for the downloaded or seeding // data for the torrent. For more information, see the ``storage`` field. - explicit add_torrent_params(storage_constructor_type sc = default_storage_constructor) - : storage(storage_constructor_type(sc)) {} - add_torrent_params(add_torrent_params&&) noexcept = default; - add_torrent_params& operator=(add_torrent_params&&) noexcept = default; - add_torrent_params(add_torrent_params const&) = default; - add_torrent_params& operator=(add_torrent_params const&) = default; + explicit add_torrent_params(storage_constructor_type sc = default_storage_constructor); + add_torrent_params(add_torrent_params&&) noexcept; + // TODO: GCC did not make std::string nothrow move-assignable + add_torrent_params& operator=(add_torrent_params&&); + add_torrent_params(add_torrent_params const&); + add_torrent_params& operator=(add_torrent_params const&); // values for the ``flags`` field enum flags_t : std::uint64_t @@ -524,19 +524,6 @@ namespace libtorrent { #endif }; - - static_assert(std::is_nothrow_move_constructible::value - , "should be nothrow move constructible"); - - // 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 by default either -// static_assert(std::is_nothrow_move_assignable::value -// , "should be nothrow move assignable"); - - // TODO: it would be nice if this was nothrow default constructible -// static_assert(std::is_nothrow_default_constructible::value -// , "should be nothrow default constructible"); } #endif diff --git a/include/libtorrent/bitfield.hpp b/include/libtorrent/bitfield.hpp index b95b41d49..f6028ec7e 100644 --- a/include/libtorrent/bitfield.hpp +++ b/include/libtorrent/bitfield.hpp @@ -256,13 +256,6 @@ namespace libtorrent { aux::unique_ptr m_buf; }; - static_assert(std::is_nothrow_move_constructible::value - , "should be nothrow move constructible"); - static_assert(std::is_nothrow_move_assignable::value - , "should be nothrow move assignable"); - static_assert(std::is_nothrow_default_constructible::value - , "should be nothrow default constructible"); - template struct typed_bitfield : bitfield { @@ -301,14 +294,6 @@ namespace libtorrent { IndexType end_index() const { return IndexType(this->size()); } }; - - static_assert(std::is_nothrow_move_constructible>::value - , "should be nothrow move constructible"); - static_assert(std::is_nothrow_move_assignable>::value - , "should be nothrow move assignable"); - static_assert(std::is_nothrow_default_constructible>::value - , "should be nothrow default constructible"); - } #endif // TORRENT_BITFIELD_HPP_INCLUDED diff --git a/include/libtorrent/heterogeneous_queue.hpp b/include/libtorrent/heterogeneous_queue.hpp index 63d255eff..195108522 100644 --- a/include/libtorrent/heterogeneous_queue.hpp +++ b/include/libtorrent/heterogeneous_queue.hpp @@ -258,4 +258,3 @@ namespace libtorrent { } #endif - diff --git a/include/libtorrent/sha1_hash.hpp b/include/libtorrent/sha1_hash.hpp index c4adfa61f..a3073bf13 100644 --- a/include/libtorrent/sha1_hash.hpp +++ b/include/libtorrent/sha1_hash.hpp @@ -276,13 +276,6 @@ namespace aux { // peer IDs, node IDs etc. using sha1_hash = digest32<160>; - static_assert(std::is_nothrow_move_constructible::value - , "should be nothrow move constructible"); - static_assert(std::is_nothrow_move_assignable::value - , "should be nothrow move assignable"); - static_assert(std::is_nothrow_default_constructible::value - , "should be nothrow default constructible"); - #if TORRENT_USE_IOSTREAM // print a sha1_hash object to an ostream as 40 hexadecimal digits diff --git a/include/libtorrent/torrent_handle.hpp b/include/libtorrent/torrent_handle.hpp index b03c24bd9..9a5e57474 100644 --- a/include/libtorrent/torrent_handle.hpp +++ b/include/libtorrent/torrent_handle.hpp @@ -1312,13 +1312,6 @@ namespace libtorrent { namespace aux { std::weak_ptr m_torrent; }; - - static_assert(std::is_nothrow_move_constructible::value - , "should be nothrow move constructible"); - static_assert(std::is_nothrow_move_assignable::value - , "should be nothrow move assignable"); - static_assert(std::is_nothrow_default_constructible::value - , "should be nothrow default constructible"); } namespace std diff --git a/include/libtorrent/torrent_status.hpp b/include/libtorrent/torrent_status.hpp index 66cd3e5cf..73e5bc253 100644 --- a/include/libtorrent/torrent_status.hpp +++ b/include/libtorrent/torrent_status.hpp @@ -560,13 +560,6 @@ namespace libtorrent { seconds finished_duration; seconds seeding_duration; }; - - static_assert(std::is_nothrow_move_constructible::value - , "should be nothrow move constructible"); -// static_assert(std::is_nothrow_move_assignable::value -// , "should be nothrow move assignable"); - static_assert(std::is_nothrow_default_constructible::value - , "should be nothrow default constructible"); } namespace std diff --git a/src/Makefile.am b/src/Makefile.am index 2ad890dab..526defb75 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -160,6 +160,7 @@ libtorrent_rasterbar_la_SOURCES = \ version.cpp \ file_progress.cpp \ ffs.cpp \ + add_torrent_params.cpp \ \ $(KADEMLIA_SOURCES) \ \ diff --git a/src/add_torrent_params.cpp b/src/add_torrent_params.cpp new file mode 100644 index 000000000..c831772e1 --- /dev/null +++ b/src/add_torrent_params.cpp @@ -0,0 +1,56 @@ +/* + +Copyright (c) 2017, Arvid Norberg, Alden Torres +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include "libtorrent/add_torrent_params.hpp" + +namespace libtorrent { + + add_torrent_params::add_torrent_params(storage_constructor_type sc) + : storage(storage_constructor_type(sc)) {} + add_torrent_params::add_torrent_params(add_torrent_params&&) noexcept = default; + add_torrent_params& add_torrent_params::operator=(add_torrent_params&&) = default; + add_torrent_params::add_torrent_params(add_torrent_params const&) = default; + add_torrent_params& add_torrent_params::operator=(add_torrent_params const&) = default; + + static_assert(std::is_nothrow_move_constructible::value + , "should be nothrow move constructible"); + + // 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 by default either +// static_assert(std::is_nothrow_move_assignable::value +// , "should be nothrow move assignable"); + + // TODO: it would be nice if this was nothrow default constructible +// static_assert(std::is_nothrow_default_constructible::value +// , "should be nothrow default constructible"); +} diff --git a/src/bitfield.cpp b/src/bitfield.cpp index 078453f4f..d2b9cae68 100644 --- a/src/bitfield.cpp +++ b/src/bitfield.cpp @@ -213,4 +213,18 @@ namespace libtorrent { ? (num - 1) * 32 + ext : size - (aux::count_trailing_ones({&m_buf[1], std::size_t(num - 1)}) + ext); } + + static_assert(std::is_nothrow_move_constructible::value + , "should be nothrow move constructible"); + static_assert(std::is_nothrow_move_assignable::value + , "should be nothrow move assignable"); + static_assert(std::is_nothrow_default_constructible::value + , "should be nothrow default constructible"); + + static_assert(std::is_nothrow_move_constructible>::value + , "should be nothrow move constructible"); + static_assert(std::is_nothrow_move_assignable>::value + , "should be nothrow move assignable"); + static_assert(std::is_nothrow_default_constructible>::value + , "should be nothrow default constructible"); } diff --git a/src/sha1_hash.cpp b/src/sha1_hash.cpp index 2396ecc05..a83f86e40 100644 --- a/src/sha1_hash.cpp +++ b/src/sha1_hash.cpp @@ -137,4 +137,11 @@ namespace aux { } } } + + static_assert(std::is_nothrow_move_constructible::value + , "should be nothrow move constructible"); + static_assert(std::is_nothrow_move_assignable::value + , "should be nothrow move assignable"); + static_assert(std::is_nothrow_default_constructible::value + , "should be nothrow default constructible"); } diff --git a/src/torrent_handle.cpp b/src/torrent_handle.cpp index 0948d99b1..5e446ab7b 100644 --- a/src/torrent_handle.cpp +++ b/src/torrent_handle.cpp @@ -750,4 +750,11 @@ namespace libtorrent { // for expired weak_ptrs. So, we're left with a hack return std::size_t(*reinterpret_cast(&th.m_torrent)); } + + static_assert(std::is_nothrow_move_constructible::value + , "should be nothrow move constructible"); + static_assert(std::is_nothrow_move_assignable::value + , "should be nothrow move assignable"); + static_assert(std::is_nothrow_default_constructible::value + , "should be nothrow default constructible"); } diff --git a/src/torrent_status.cpp b/src/torrent_status.cpp index 6daf65e74..ecef3831e 100644 --- a/src/torrent_status.cpp +++ b/src/torrent_status.cpp @@ -39,10 +39,18 @@ namespace libtorrent { file_index_t constexpr torrent_status::error_file_ssl_ctx; file_index_t constexpr torrent_status::error_file_metadata; file_index_t constexpr torrent_status::error_file_exception; + torrent_status::torrent_status() noexcept {} torrent_status::~torrent_status() = default; torrent_status::torrent_status(torrent_status const&) = default; torrent_status& torrent_status::operator=(torrent_status const&) = default; torrent_status::torrent_status(torrent_status&&) noexcept = default; torrent_status& torrent_status::operator=(torrent_status&&) = default; + + static_assert(std::is_nothrow_move_constructible::value + , "should be nothrow move constructible"); +// static_assert(std::is_nothrow_move_assignable::value +// , "should be nothrow move assignable"); + static_assert(std::is_nothrow_default_constructible::value + , "should be nothrow default constructible"); }