Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2009-03-09 20:56:23 +00:00
|
|
|
// Copyright 2008-2009 Daniel James.
|
2023-02-14 10:31:50 -08:00
|
|
|
// Copyright 2022-2023 Christian Mazakas.
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
|
|
|
// file LICENSE_1_0.txt or move at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
|
|
2022-10-20 15:25:40 -07:00
|
|
|
#include "../helpers/unordered.hpp"
|
2012-04-08 15:29:15 +00:00
|
|
|
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
#include "../helpers/equivalent.hpp"
|
|
|
|
|
#include "../helpers/invariants.hpp"
|
2023-08-15 13:03:52 -07:00
|
|
|
#include "../helpers/random_values.hpp"
|
|
|
|
|
#include "../helpers/test.hpp"
|
|
|
|
|
#include "../helpers/tracker.hpp"
|
|
|
|
|
#include "../objects/cxx11_allocator.hpp"
|
|
|
|
|
#include "../objects/test.hpp"
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2022-08-16 14:32:30 -07:00
|
|
|
#include <boost/core/ignore_unused.hpp>
|
|
|
|
|
#include <iterator>
|
|
|
|
|
|
2011-08-14 21:03:18 +00:00
|
|
|
#if defined(BOOST_MSVC)
|
2017-02-19 13:05:17 +00:00
|
|
|
#pragma warning(disable : 4127) // conditional expression is constant
|
2011-08-14 21:03:18 +00:00
|
|
|
#endif
|
|
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
namespace move_tests {
|
2017-06-11 20:55:59 +01:00
|
|
|
test::seed_t initialize_seed(98624);
|
2012-01-06 08:35:51 +00:00
|
|
|
#define BOOST_UNORDERED_TEST_MOVING 1
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
template <class T> T empty(T*) { return T(); }
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
template <class T>
|
|
|
|
|
T create(test::random_values<T> const& v, test::object_count& count)
|
|
|
|
|
{
|
2017-02-19 13:05:17 +00:00
|
|
|
T x(v.begin(), v.end());
|
|
|
|
|
count = test::global_object_count;
|
|
|
|
|
return x;
|
2017-06-11 20:55:59 +01:00
|
|
|
}
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
template <class T>
|
|
|
|
|
T create(test::random_values<T> const& v, test::object_count& count,
|
2018-01-27 09:39:59 +00:00
|
|
|
typename T::hasher hf, typename T::key_equal eq,
|
|
|
|
|
typename T::allocator_type al, float mlf)
|
2017-06-11 20:55:59 +01:00
|
|
|
{
|
2017-02-19 13:05:17 +00:00
|
|
|
T x(0, hf, eq, al);
|
|
|
|
|
x.max_load_factor(mlf);
|
|
|
|
|
x.insert(v.begin(), v.end());
|
|
|
|
|
count = test::global_object_count;
|
|
|
|
|
return x;
|
2017-06-11 20:55:59 +01:00
|
|
|
}
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
template <class T>
|
|
|
|
|
void move_construct_tests1(T* ptr, test::random_generator const& generator)
|
|
|
|
|
{
|
2018-01-27 09:39:59 +00:00
|
|
|
typename T::hasher hf;
|
|
|
|
|
typename T::key_equal eq;
|
|
|
|
|
typename T::allocator_type al;
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
|
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
|
|
|
|
|
|
|
|
|
T y(empty(ptr));
|
|
|
|
|
BOOST_TEST(y.empty());
|
|
|
|
|
BOOST_TEST(test::equivalent(y.hash_function(), hf));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.key_eq(), eq));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al));
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 1.0);
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_equivalent_keys(y);
|
2023-08-15 13:03:52 -07:00
|
|
|
|
|
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
using allocator_type = typename T::allocator_type;
|
|
|
|
|
using value_type =
|
|
|
|
|
typename boost::allocator_value_type<allocator_type>::type;
|
|
|
|
|
using pointer = typename boost::allocator_pointer<allocator_type>::type;
|
|
|
|
|
if (std::is_same<pointer, value_type*>::value) {
|
|
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
|
|
|
|
}
|
|
|
|
|
#else
|
2022-08-23 11:06:07 -07:00
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
|
|
|
|
#endif
|
2017-02-19 13:05:17 +00:00
|
|
|
}
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
2011-08-14 18:52:43 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::random_values<T> v(1000, generator);
|
|
|
|
|
test::object_count count;
|
|
|
|
|
T y(create(v, count));
|
2009-11-10 18:17:53 +00:00
|
|
|
#if defined(BOOST_HAS_NRVO)
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(count == test::global_object_count);
|
2009-11-10 18:17:53 +00:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_container(y, v);
|
|
|
|
|
test::check_equivalent_keys(y);
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
}
|
2017-06-11 20:55:59 +01:00
|
|
|
}
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
template <class T>
|
2022-08-23 11:06:07 -07:00
|
|
|
void move_assign_tests1(T* p, test::random_generator const& generator)
|
2017-06-11 20:55:59 +01:00
|
|
|
{
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
2011-08-14 18:52:43 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::random_values<T> v(500, generator);
|
|
|
|
|
test::object_count count;
|
|
|
|
|
T y;
|
|
|
|
|
y = create(v, count);
|
2012-01-06 08:35:51 +00:00
|
|
|
#if BOOST_UNORDERED_TEST_MOVING && defined(BOOST_HAS_NRVO)
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(count == test::global_object_count);
|
2022-08-23 11:06:07 -07:00
|
|
|
#endif
|
|
|
|
|
test::check_container(y, v);
|
|
|
|
|
test::check_equivalent_keys(y);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
test::random_values<T> v;
|
|
|
|
|
|
|
|
|
|
T y;
|
|
|
|
|
y = empty(p);
|
2023-08-31 13:11:31 -07:00
|
|
|
|
2023-08-15 13:03:52 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
using allocator_type = typename T::allocator_type;
|
|
|
|
|
using value_type =
|
|
|
|
|
typename boost::allocator_value_type<allocator_type>::type;
|
|
|
|
|
using pointer = typename boost::allocator_pointer<allocator_type>::type;
|
|
|
|
|
if (std::is_same<pointer, value_type*>::value) {
|
|
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
|
|
|
|
}
|
|
|
|
|
#else
|
2022-08-23 11:06:07 -07:00
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
2009-11-10 18:17:53 +00:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_container(y, v);
|
|
|
|
|
test::check_equivalent_keys(y);
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
}
|
2017-06-11 20:55:59 +01:00
|
|
|
}
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
template <class T>
|
|
|
|
|
void move_construct_tests2(T*, test::random_generator const& generator)
|
|
|
|
|
{
|
2018-01-27 09:39:59 +00:00
|
|
|
typename T::hasher hf(1);
|
|
|
|
|
typename T::key_equal eq(1);
|
|
|
|
|
typename T::allocator_type al(1);
|
|
|
|
|
typename T::allocator_type al2(2);
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
test::object_count count;
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
2011-08-14 18:52:43 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::random_values<T> v(500, generator);
|
|
|
|
|
T y(create(v, count, hf, eq, al, 0.5));
|
2009-11-10 18:17:53 +00:00
|
|
|
#if defined(BOOST_HAS_NRVO)
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(count == test::global_object_count);
|
2009-11-10 18:17:53 +00:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_container(y, v);
|
|
|
|
|
BOOST_TEST(test::equivalent(y.hash_function(), hf));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.key_eq(), eq));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al));
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 0.5); // Not necessarily required.
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_equivalent_keys(y);
|
2017-02-19 13:05:17 +00:00
|
|
|
}
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
|
|
|
|
|
|
|
|
|
// TODO: To do this correctly requires the fancy new allocator
|
|
|
|
|
// stuff.
|
|
|
|
|
test::random_values<T> v(500, generator);
|
|
|
|
|
T y(create(v, count, hf, eq, al, 2.0), al2);
|
|
|
|
|
BOOST_TEST(count != test::global_object_count);
|
|
|
|
|
test::check_container(y, v);
|
|
|
|
|
BOOST_TEST(test::equivalent(y.hash_function(), hf));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.key_eq(), eq));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al2));
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 2.0); // Not necessarily required.
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_equivalent_keys(y);
|
2017-02-19 13:05:17 +00:00
|
|
|
}
|
2011-08-14 18:53:29 +00:00
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
2011-08-14 18:52:43 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::random_values<T> v(25, generator);
|
|
|
|
|
T y(create(v, count, hf, eq, al, 1.0), al);
|
|
|
|
|
BOOST_TEST(count == test::global_object_count);
|
2023-08-31 13:11:31 -07:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_container(y, v);
|
|
|
|
|
BOOST_TEST(test::equivalent(y.hash_function(), hf));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.key_eq(), eq));
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al));
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 1.0); // Not necessarily required.
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_equivalent_keys(y);
|
2011-08-14 18:53:29 +00:00
|
|
|
}
|
2017-06-11 20:55:59 +01:00
|
|
|
}
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
template <class T>
|
|
|
|
|
void move_assign_tests2(T*, test::random_generator const& generator)
|
|
|
|
|
{
|
2018-01-27 09:39:59 +00:00
|
|
|
typename T::hasher hf(1);
|
|
|
|
|
typename T::key_equal eq(1);
|
|
|
|
|
typename T::allocator_type al1(1);
|
|
|
|
|
typename T::allocator_type al2(2);
|
|
|
|
|
typedef typename T::allocator_type allocator_type;
|
2011-08-14 18:53:29 +00:00
|
|
|
|
|
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::random_values<T> v(500, generator);
|
|
|
|
|
test::random_values<T> v2(0, generator);
|
|
|
|
|
T y(v.begin(), v.end(), 0, hf, eq, al1);
|
|
|
|
|
test::object_count count;
|
|
|
|
|
y = create(v2, count, hf, eq, al2, 2.0);
|
|
|
|
|
BOOST_TEST(y.empty());
|
|
|
|
|
test::check_container(y, v2);
|
|
|
|
|
test::check_equivalent_keys(y);
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 2.0);
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2011-10-11 08:37:06 +00:00
|
|
|
|
|
|
|
|
#if defined(BOOST_HAS_NRVO)
|
2017-06-11 20:55:59 +01:00
|
|
|
if (BOOST_UNORDERED_TEST_MOVING
|
|
|
|
|
? (bool)allocator_type::is_propagate_on_move
|
|
|
|
|
: (bool)allocator_type::is_propagate_on_assign) {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al2));
|
|
|
|
|
} else {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al1));
|
|
|
|
|
}
|
2017-02-19 13:05:17 +00:00
|
|
|
#endif
|
|
|
|
|
}
|
2011-08-14 18:53:29 +00:00
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::random_values<T> v(500, generator);
|
|
|
|
|
test::object_count count;
|
|
|
|
|
T y(0, hf, eq, al1);
|
|
|
|
|
y = create(v, count, hf, eq, al2, 0.5);
|
2011-08-14 18:53:29 +00:00
|
|
|
#if defined(BOOST_HAS_NRVO)
|
2017-06-11 20:55:59 +01:00
|
|
|
if (BOOST_UNORDERED_TEST_MOVING && allocator_type::is_propagate_on_move) {
|
|
|
|
|
BOOST_TEST(count == test::global_object_count);
|
|
|
|
|
}
|
2011-08-14 18:53:29 +00:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_container(y, v);
|
|
|
|
|
test::check_equivalent_keys(y);
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 0.5);
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2011-10-11 08:37:06 +00:00
|
|
|
|
|
|
|
|
#if defined(BOOST_HAS_NRVO)
|
2017-06-11 20:55:59 +01:00
|
|
|
if (BOOST_UNORDERED_TEST_MOVING
|
|
|
|
|
? (bool)allocator_type::is_propagate_on_move
|
|
|
|
|
: (bool)allocator_type::is_propagate_on_assign) {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al2));
|
|
|
|
|
} else {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al1));
|
|
|
|
|
}
|
2011-10-11 08:37:06 +00:00
|
|
|
#endif
|
2017-02-19 13:05:17 +00:00
|
|
|
}
|
|
|
|
|
|
2022-08-23 11:06:07 -07:00
|
|
|
{
|
|
|
|
|
test::random_values<T> v;
|
|
|
|
|
T y(0, hf, eq, al1);
|
|
|
|
|
T x(0, hf, eq, al2);
|
|
|
|
|
x.max_load_factor(0.25);
|
|
|
|
|
|
2023-08-15 13:03:52 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
{
|
|
|
|
|
using value_type =
|
|
|
|
|
typename boost::allocator_value_type<allocator_type>::type;
|
|
|
|
|
using pointer = typename boost::allocator_pointer<allocator_type>::type;
|
|
|
|
|
if (std::is_same<pointer, value_type*>::value) {
|
|
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#else
|
2022-08-23 11:06:07 -07:00
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
2023-08-15 13:03:52 -07:00
|
|
|
#endif
|
2022-08-23 11:06:07 -07:00
|
|
|
|
2023-08-28 12:59:00 -07:00
|
|
|
y = std::move(x);
|
2023-08-31 13:11:31 -07:00
|
|
|
|
2023-08-15 13:03:52 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
{
|
|
|
|
|
using value_type =
|
|
|
|
|
typename boost::allocator_value_type<allocator_type>::type;
|
|
|
|
|
using pointer = typename boost::allocator_pointer<allocator_type>::type;
|
|
|
|
|
if (std::is_same<pointer, value_type*>::value) {
|
|
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#else
|
2022-08-23 11:06:07 -07:00
|
|
|
BOOST_TEST_EQ(test::detail::tracker.count_allocations, 0u);
|
|
|
|
|
#endif
|
|
|
|
|
test::check_container(y, v);
|
|
|
|
|
test::check_equivalent_keys(y);
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2022-08-23 11:06:07 -07:00
|
|
|
BOOST_TEST(y.max_load_factor() == 0.25);
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2022-08-23 11:06:07 -07:00
|
|
|
|
|
|
|
|
if (BOOST_UNORDERED_TEST_MOVING
|
|
|
|
|
? (bool)allocator_type::is_propagate_on_move
|
|
|
|
|
: (bool)allocator_type::is_propagate_on_assign) {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al2));
|
|
|
|
|
} else {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al1));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-02-19 13:05:17 +00:00
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
|
|
|
|
|
|
|
|
|
test::random_values<T> v(500, generator);
|
|
|
|
|
T y(0, hf, eq, al1);
|
|
|
|
|
|
|
|
|
|
T x(0, hf, eq, al2);
|
|
|
|
|
x.max_load_factor(0.25);
|
|
|
|
|
x.insert(v.begin(), v.end());
|
|
|
|
|
|
|
|
|
|
test::object_count count = test::global_object_count;
|
2023-08-28 12:59:00 -07:00
|
|
|
y = std::move(x);
|
2017-06-11 20:55:59 +01:00
|
|
|
if (BOOST_UNORDERED_TEST_MOVING && allocator_type::is_propagate_on_move) {
|
|
|
|
|
BOOST_TEST(count == test::global_object_count);
|
|
|
|
|
}
|
|
|
|
|
test::check_container(y, v);
|
|
|
|
|
test::check_equivalent_keys(y);
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 0.25);
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2017-06-11 20:55:59 +01:00
|
|
|
|
|
|
|
|
if (BOOST_UNORDERED_TEST_MOVING
|
|
|
|
|
? (bool)allocator_type::is_propagate_on_move
|
|
|
|
|
: (bool)allocator_type::is_propagate_on_assign) {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al2));
|
|
|
|
|
} else {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al1));
|
|
|
|
|
}
|
2017-02-19 13:05:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_instances check_;
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::random_values<T> v1(1000, generator);
|
|
|
|
|
test::random_values<T> v2(200, generator);
|
2011-10-11 08:37:06 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
T x(0, hf, eq, al2);
|
|
|
|
|
x.max_load_factor(0.5);
|
|
|
|
|
x.insert(v2.begin(), v2.end());
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::object_count count1 = test::global_object_count;
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
T y(v1.begin(), v1.end(), 0, hf, eq, al1);
|
2023-08-28 12:59:00 -07:00
|
|
|
y = std::move(x);
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::object_count count2 = test::global_object_count;
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
if (BOOST_UNORDERED_TEST_MOVING && allocator_type::is_propagate_on_move) {
|
|
|
|
|
BOOST_TEST(count1.instances == test::global_object_count.instances);
|
|
|
|
|
BOOST_TEST(
|
|
|
|
|
count2.constructions == test::global_object_count.constructions);
|
|
|
|
|
}
|
2011-10-11 08:37:06 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
test::check_container(y, v2);
|
|
|
|
|
test::check_equivalent_keys(y);
|
2022-10-04 14:51:03 -07:00
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
BOOST_TEST(y.max_load_factor() == 0.875);
|
|
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
BOOST_TEST(y.max_load_factor() == 0.5);
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
if (BOOST_UNORDERED_TEST_MOVING
|
|
|
|
|
? (bool)allocator_type::is_propagate_on_move
|
|
|
|
|
: (bool)allocator_type::is_propagate_on_assign) {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al2));
|
|
|
|
|
} else {
|
|
|
|
|
BOOST_TEST(test::equivalent(y.get_allocator(), al1));
|
|
|
|
|
}
|
2011-08-14 18:53:29 +00:00
|
|
|
}
|
2017-06-11 20:55:59 +01:00
|
|
|
}
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2022-10-04 14:51:03 -07:00
|
|
|
using test::default_generator;
|
|
|
|
|
using test::generate_collisions;
|
|
|
|
|
using test::limited_range;
|
|
|
|
|
|
|
|
|
|
#ifdef BOOST_UNORDERED_FOA_TESTS
|
|
|
|
|
boost::unordered_flat_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
std::allocator<std::pair<test::object const, test::object> > >*
|
|
|
|
|
test_map_std_alloc;
|
|
|
|
|
|
|
|
|
|
boost::unordered_flat_set<test::object, test::hash, test::equal_to,
|
|
|
|
|
test::allocator2<test::object> >* test_set;
|
|
|
|
|
boost::unordered_flat_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
test::allocator1<std::pair<test::object const, test::object> > >* test_map;
|
|
|
|
|
|
|
|
|
|
boost::unordered_flat_set<test::object, test::hash, test::equal_to,
|
|
|
|
|
test::cxx11_allocator<test::object, test::propagate_move> >*
|
|
|
|
|
test_set_prop_move;
|
|
|
|
|
boost::unordered_flat_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::propagate_move> >* test_map_prop_move;
|
|
|
|
|
|
|
|
|
|
boost::unordered_flat_set<test::object, test::hash, test::equal_to,
|
|
|
|
|
test::cxx11_allocator<test::object, test::no_propagate_move> >*
|
|
|
|
|
test_set_no_prop_move;
|
|
|
|
|
boost::unordered_flat_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::no_propagate_move> >* test_map_no_prop_move;
|
|
|
|
|
|
2023-02-14 10:31:50 -08:00
|
|
|
boost::unordered_node_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
std::allocator<std::pair<test::object const, test::object> > >*
|
|
|
|
|
test_node_map_std_alloc;
|
|
|
|
|
|
|
|
|
|
boost::unordered_node_set<test::object, test::hash, test::equal_to,
|
|
|
|
|
test::allocator2<test::object> >* test_node_set;
|
|
|
|
|
boost::unordered_node_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
test::allocator1<std::pair<test::object const, test::object> > >*
|
|
|
|
|
test_node_map;
|
|
|
|
|
|
|
|
|
|
boost::unordered_node_set<test::object, test::hash, test::equal_to,
|
|
|
|
|
test::cxx11_allocator<test::object, test::propagate_move> >*
|
|
|
|
|
test_node_set_prop_move;
|
|
|
|
|
boost::unordered_node_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::propagate_move> >* test_node_map_prop_move;
|
|
|
|
|
|
|
|
|
|
boost::unordered_node_set<test::object, test::hash, test::equal_to,
|
|
|
|
|
test::cxx11_allocator<test::object, test::no_propagate_move> >*
|
|
|
|
|
test_node_set_no_prop_move;
|
|
|
|
|
boost::unordered_node_map<test::object, test::object, test::hash,
|
|
|
|
|
test::equal_to,
|
|
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::no_propagate_move> >* test_node_map_no_prop_move;
|
|
|
|
|
|
|
|
|
|
// clang-format off
|
2022-10-04 14:51:03 -07:00
|
|
|
UNORDERED_TEST(move_construct_tests1,
|
2023-02-14 10:31:50 -08:00
|
|
|
((test_map_std_alloc)(test_set)(test_map)
|
|
|
|
|
(test_set_prop_move)(test_map_prop_move)
|
|
|
|
|
(test_set_no_prop_move)(test_map_no_prop_move)
|
|
|
|
|
(test_node_map_std_alloc)(test_node_set)(test_node_map)
|
|
|
|
|
(test_node_set_prop_move)(test_node_map_prop_move)
|
|
|
|
|
(test_node_set_no_prop_move)(test_node_map_no_prop_move))(
|
2022-10-04 14:51:03 -07:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
|
|
|
|
UNORDERED_TEST(move_assign_tests1,
|
2023-02-14 10:31:50 -08:00
|
|
|
((test_map_std_alloc)(test_set)(test_map)
|
|
|
|
|
(test_set_prop_move)(test_map_prop_move)
|
|
|
|
|
(test_set_no_prop_move)(test_map_no_prop_move)
|
|
|
|
|
(test_node_map_std_alloc)(test_node_set)(test_node_map)
|
|
|
|
|
(test_node_set_prop_move)(test_node_map_prop_move)
|
|
|
|
|
(test_node_set_no_prop_move)(test_node_map_no_prop_move))(
|
2022-10-04 14:51:03 -07:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
|
|
|
|
UNORDERED_TEST(move_construct_tests2,
|
2023-02-14 10:31:50 -08:00
|
|
|
((test_set)(test_map)
|
|
|
|
|
(test_set_prop_move)(test_map_prop_move)
|
|
|
|
|
(test_set_no_prop_move)(test_map_no_prop_move)
|
|
|
|
|
(test_node_set)(test_node_map)
|
|
|
|
|
(test_node_set_prop_move)(test_node_map_prop_move)
|
|
|
|
|
(test_node_set_no_prop_move)(test_node_map_no_prop_move))(
|
2022-10-04 14:51:03 -07:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
|
|
|
|
UNORDERED_TEST(move_assign_tests2,
|
2023-02-14 10:31:50 -08:00
|
|
|
((test_set)(test_map)
|
|
|
|
|
(test_set_prop_move)(test_map_prop_move)
|
|
|
|
|
(test_set_no_prop_move)(test_map_no_prop_move)
|
|
|
|
|
(test_node_set)(test_node_map)
|
|
|
|
|
(test_node_set_prop_move)(test_node_map_prop_move)
|
|
|
|
|
(test_node_set_no_prop_move)(test_node_map_no_prop_move))(
|
2022-10-04 14:51:03 -07:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
2023-02-14 10:31:50 -08:00
|
|
|
// clang-format on
|
2022-10-04 14:51:03 -07:00
|
|
|
#else
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_map<test::object, test::object, test::hash, test::equal_to,
|
2022-08-16 14:32:52 -07:00
|
|
|
std::allocator<std::pair<test::object const, test::object> > >*
|
|
|
|
|
test_map_std_alloc;
|
2017-02-19 13:05:17 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_set<test::object, test::hash, test::equal_to,
|
2017-02-19 13:05:17 +00:00
|
|
|
test::allocator2<test::object> >* test_set;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_multiset<test::object, test::hash, test::equal_to,
|
2017-02-19 13:05:17 +00:00
|
|
|
test::allocator1<test::object> >* test_multiset;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_map<test::object, test::object, test::hash, test::equal_to,
|
2022-08-16 14:32:52 -07:00
|
|
|
test::allocator1<std::pair<test::object const, test::object> > >* test_map;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_multimap<test::object, test::object, test::hash,
|
2022-08-16 14:32:52 -07:00
|
|
|
test::equal_to,
|
|
|
|
|
test::allocator2<std::pair<test::object const, test::object> > >*
|
|
|
|
|
test_multimap;
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_set<test::object, test::hash, test::equal_to,
|
2017-02-19 13:05:17 +00:00
|
|
|
test::cxx11_allocator<test::object, test::propagate_move> >*
|
2011-08-14 18:53:29 +00:00
|
|
|
test_set_prop_move;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_multiset<test::object, test::hash, test::equal_to,
|
2017-02-19 13:05:17 +00:00
|
|
|
test::cxx11_allocator<test::object, test::propagate_move> >*
|
2011-08-14 18:53:29 +00:00
|
|
|
test_multiset_prop_move;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_map<test::object, test::object, test::hash, test::equal_to,
|
2022-08-16 14:32:52 -07:00
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::propagate_move> >* test_map_prop_move;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_multimap<test::object, test::object, test::hash,
|
2022-08-16 14:32:52 -07:00
|
|
|
test::equal_to,
|
|
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::propagate_move> >* test_multimap_prop_move;
|
2011-08-14 18:53:29 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_set<test::object, test::hash, test::equal_to,
|
2017-02-19 13:05:17 +00:00
|
|
|
test::cxx11_allocator<test::object, test::no_propagate_move> >*
|
2011-08-14 18:53:29 +00:00
|
|
|
test_set_no_prop_move;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_multiset<test::object, test::hash, test::equal_to,
|
2017-02-19 13:05:17 +00:00
|
|
|
test::cxx11_allocator<test::object, test::no_propagate_move> >*
|
2011-08-14 18:53:29 +00:00
|
|
|
test_multiset_no_prop_move;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_map<test::object, test::object, test::hash, test::equal_to,
|
2022-08-16 14:32:52 -07:00
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::no_propagate_move> >* test_map_no_prop_move;
|
2017-06-11 20:55:59 +01:00
|
|
|
boost::unordered_multimap<test::object, test::object, test::hash,
|
2017-02-19 13:05:17 +00:00
|
|
|
test::equal_to,
|
2022-08-16 14:32:52 -07:00
|
|
|
test::cxx11_allocator<std::pair<test::object const, test::object>,
|
|
|
|
|
test::no_propagate_move> >* test_multimap_no_prop_move;
|
2011-08-14 18:53:29 +00:00
|
|
|
|
2017-06-11 20:55:59 +01:00
|
|
|
UNORDERED_TEST(move_construct_tests1,
|
2023-08-15 13:03:52 -07:00
|
|
|
((test_map_std_alloc)(test_set)(test_multiset)(test_map)(test_multimap)(test_set_prop_move)(test_multiset_prop_move)(test_map_prop_move)(test_multimap_prop_move)(test_set_no_prop_move)(test_multiset_no_prop_move)(test_map_no_prop_move)(test_multimap_no_prop_move))(
|
2017-10-05 10:54:22 +01:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
2017-06-11 20:55:59 +01:00
|
|
|
UNORDERED_TEST(move_assign_tests1,
|
2023-08-15 13:03:52 -07:00
|
|
|
((test_map_std_alloc)(test_set)(test_multiset)(test_map)(test_multimap)(test_set_prop_move)(test_multiset_prop_move)(test_map_prop_move)(test_multimap_prop_move)(test_set_no_prop_move)(test_multiset_no_prop_move)(test_map_no_prop_move)(test_multimap_no_prop_move))(
|
2017-10-05 10:54:22 +01:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
2017-06-11 20:55:59 +01:00
|
|
|
UNORDERED_TEST(move_construct_tests2,
|
2023-08-15 13:03:52 -07:00
|
|
|
((test_set)(test_multiset)(test_map)(test_multimap)(test_set_prop_move)(test_multiset_prop_move)(test_map_prop_move)(test_multimap_prop_move)(test_set_no_prop_move)(test_multiset_no_prop_move)(test_map_no_prop_move)(test_multimap_no_prop_move))(
|
2017-10-05 10:54:22 +01:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
2017-06-11 20:55:59 +01:00
|
|
|
UNORDERED_TEST(move_assign_tests2,
|
2023-08-15 13:03:52 -07:00
|
|
|
((test_set)(test_multiset)(test_map)(test_multimap)(test_set_prop_move)(test_multiset_prop_move)(test_map_prop_move)(test_multimap_prop_move)(test_set_no_prop_move)(test_multiset_no_prop_move)(test_map_no_prop_move)(test_multimap_no_prop_move))(
|
2017-10-05 10:54:22 +01:00
|
|
|
(default_generator)(generate_collisions)(limited_range)))
|
2022-10-04 14:51:03 -07:00
|
|
|
#endif
|
2023-08-15 13:03:52 -07:00
|
|
|
} // namespace move_tests
|
Movable unordered containers, full support only for compilers with rvalue references.
Merged revisions 44076-44414 via svnmerge from
https://svn.boost.org/svn/boost/branches/unordered/trunk
........
r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
Move semantics for compilers with rvalue references.
........
r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
Do move assignment 'properly'.
........
r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
........
r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
Add missing tests.
........
r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
Avoid using rvalue references in the implementation files.
........
r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
Use a cut down version of the work in progress move library to implement move
semantics on more compilers. Unfortunately the move constructor with allocator
isn't really practical at the moment, since in the case where the container
can't be moved, and the allocators aren't equal it will copy the container
twice.
........
[SVN r44486]
2008-04-17 07:34:15 +00:00
|
|
|
|
|
|
|
|
RUN_TESTS()
|