mirror of
https://github.com/boostorg/container.git
synced 2026-01-19 04:02:17 +00:00
Implemented C++20's uninitialized_construct_using_allocator and make_obj_using_allocator.
This commit is contained in:
@@ -90,7 +90,7 @@ struct uses_erased_type_allocator
|
||||
bool allocator_called;
|
||||
unsigned args_called;
|
||||
|
||||
typedef boost::container::erased_type allocator_type;
|
||||
typedef erased_type allocator_type;
|
||||
typedef long constructible_from_int_t;
|
||||
|
||||
uses_erased_type_allocator()
|
||||
@@ -118,32 +118,45 @@ struct uses_erased_type_allocator
|
||||
{}
|
||||
};
|
||||
|
||||
typedef boost::container::dtl::aligned_storage<sizeof(uses_allocator_and_not_convertible_arg)>::type storage_t;
|
||||
|
||||
//Make sure aligned_storage will be big enough
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(uses_allocator_and_not_convertible_arg) );
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(not_uses_allocator) );
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(uses_allocator_and_convertible_arg) );
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(uses_erased_type_allocator) );
|
||||
|
||||
int main()
|
||||
void test_uninitialized_construct()
|
||||
{
|
||||
typedef dtl::aligned_storage<sizeof(uses_allocator_and_not_convertible_arg)>::type storage_t;
|
||||
|
||||
//Make sure aligned_storage will be big enough
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(uses_allocator_and_not_convertible_arg) );
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(not_uses_allocator) );
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(uses_allocator_and_convertible_arg) );
|
||||
BOOST_CONTAINER_STATIC_ASSERT( sizeof(storage_t) >= sizeof(uses_erased_type_allocator) );
|
||||
|
||||
storage_t storage;
|
||||
void *const st_ptr = static_cast<void*>(storage.data);
|
||||
|
||||
not_uses_allocator *nua_ptr = reinterpret_cast<not_uses_allocator*>(st_ptr);
|
||||
uses_allocator_and_not_convertible_arg *uanci_ptr = reinterpret_cast<uses_allocator_and_not_convertible_arg*>(st_ptr);
|
||||
uses_allocator_and_convertible_arg *uaci_ptr = reinterpret_cast<uses_allocator_and_convertible_arg*>(st_ptr);
|
||||
uses_erased_type_allocator *ueta_ptr = reinterpret_cast<uses_erased_type_allocator*>(st_ptr);
|
||||
|
||||
////////////////////////////////////
|
||||
//not_uses_allocator
|
||||
////////////////////////////////////
|
||||
not_uses_allocator *nua_ptr = reinterpret_cast<not_uses_allocator*>(st_ptr);
|
||||
nua_ptr = uninitialized_construct_using_allocator(nua_ptr, alloc_arg_t());
|
||||
|
||||
////////////////////////////////////
|
||||
//uses_allocator_and_convertible_arg
|
||||
uanci_ptr = uninitialized_construct_using_allocator(uanci_ptr, alloc_arg_t());
|
||||
BOOST_TEST(uanci_ptr->allocator_called == false);
|
||||
BOOST_TEST(uanci_ptr->args_called == 0u);
|
||||
////////////////////////////////////
|
||||
uses_allocator_and_convertible_arg *uaci_ptr = reinterpret_cast<uses_allocator_and_convertible_arg*>(st_ptr);
|
||||
uaci_ptr = uninitialized_construct_using_allocator(uaci_ptr, alloc_arg_t());
|
||||
BOOST_TEST(uaci_ptr->allocator_called == true);
|
||||
BOOST_TEST(uaci_ptr->args_called == 0u);
|
||||
|
||||
uaci_ptr = uninitialized_construct_using_allocator(uaci_ptr, alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(uaci_ptr->allocator_called == true);
|
||||
BOOST_TEST(uaci_ptr->args_called == 3u);
|
||||
|
||||
uaci_ptr = uninitialized_construct_using_allocator(uaci_ptr, alloc_arg_t(), arg1_t(), arg2_t());
|
||||
BOOST_TEST(uaci_ptr->allocator_called == true);
|
||||
BOOST_TEST(uaci_ptr->args_called == 2u);
|
||||
|
||||
////////////////////////////////////
|
||||
//uses_allocator_and_not_convertible_arg
|
||||
////////////////////////////////////
|
||||
uses_allocator_and_not_convertible_arg *uanci_ptr = reinterpret_cast<uses_allocator_and_not_convertible_arg*>(st_ptr);
|
||||
uanci_ptr = uninitialized_construct_using_allocator(uanci_ptr, alloc_arg_t());
|
||||
BOOST_TEST(uanci_ptr->allocator_called == false);
|
||||
BOOST_TEST(uanci_ptr->args_called == 0u);
|
||||
@@ -164,20 +177,10 @@ int main()
|
||||
BOOST_TEST(uanci_ptr->allocator_called == false);
|
||||
BOOST_TEST(uanci_ptr->args_called == 2u);
|
||||
|
||||
//uses_allocator_and_not_convertible_arg
|
||||
uaci_ptr = uninitialized_construct_using_allocator(uaci_ptr, alloc_arg_t());
|
||||
BOOST_TEST(uaci_ptr->allocator_called == true);
|
||||
BOOST_TEST(uaci_ptr->args_called == 0u);
|
||||
|
||||
uaci_ptr = uninitialized_construct_using_allocator(uaci_ptr, alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(uaci_ptr->allocator_called == true);
|
||||
BOOST_TEST(uaci_ptr->args_called == 3u);
|
||||
|
||||
uaci_ptr = uninitialized_construct_using_allocator(uaci_ptr, alloc_arg_t(), arg1_t(), arg2_t());
|
||||
BOOST_TEST(uaci_ptr->allocator_called == true);
|
||||
BOOST_TEST(uaci_ptr->args_called == 2u);
|
||||
|
||||
////////////////////////////////////
|
||||
//uses_erased_type_allocator
|
||||
////////////////////////////////////
|
||||
uses_erased_type_allocator *ueta_ptr = reinterpret_cast<uses_erased_type_allocator*>(st_ptr);
|
||||
ueta_ptr = uninitialized_construct_using_allocator(ueta_ptr, alloc_arg_t());
|
||||
BOOST_TEST(ueta_ptr->allocator_called == true);
|
||||
BOOST_TEST(ueta_ptr->args_called == 0u);
|
||||
@@ -197,6 +200,80 @@ int main()
|
||||
ueta_ptr = uninitialized_construct_using_allocator(ueta_ptr, non_alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(ueta_ptr->allocator_called == false);
|
||||
BOOST_TEST(ueta_ptr->args_called == 3u);
|
||||
}
|
||||
|
||||
void test_make_obj()
|
||||
{
|
||||
////////////////////////////////////
|
||||
//not_uses_allocator
|
||||
////////////////////////////////////
|
||||
not_uses_allocator d = make_obj_using_allocator<not_uses_allocator>(alloc_arg_t()); (void)d;
|
||||
|
||||
////////////////////////////////////
|
||||
//uses_allocator_and_convertible_arg
|
||||
////////////////////////////////////
|
||||
uses_allocator_and_convertible_arg uaci = make_obj_using_allocator<uses_allocator_and_convertible_arg>(alloc_arg_t());
|
||||
BOOST_TEST(uaci.allocator_called == true);
|
||||
BOOST_TEST(uaci.args_called == 0u);
|
||||
|
||||
uaci = make_obj_using_allocator<uses_allocator_and_convertible_arg>(alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(uaci.allocator_called == true);
|
||||
BOOST_TEST(uaci.args_called == 3u);
|
||||
|
||||
uaci = make_obj_using_allocator<uses_allocator_and_convertible_arg>(alloc_arg_t(), arg1_t(), arg2_t());
|
||||
BOOST_TEST(uaci.allocator_called == true);
|
||||
BOOST_TEST(uaci.args_called == 2u);
|
||||
|
||||
////////////////////////////////////
|
||||
//uses_allocator_and_not_convertible_arg
|
||||
////////////////////////////////////
|
||||
uses_allocator_and_not_convertible_arg uanci = make_obj_using_allocator<uses_allocator_and_not_convertible_arg>(alloc_arg_t());
|
||||
BOOST_TEST(uanci.allocator_called == false);
|
||||
BOOST_TEST(uanci.args_called == 0u);
|
||||
|
||||
uanci = make_obj_using_allocator<uses_allocator_and_not_convertible_arg>(alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(uanci.allocator_called == false);
|
||||
BOOST_TEST(uanci.args_called == 3u);
|
||||
|
||||
uanci = make_obj_using_allocator<uses_allocator_and_not_convertible_arg>(alloc_arg_t(), arg1_t(), arg2_t());
|
||||
BOOST_TEST(uanci.allocator_called == false);
|
||||
BOOST_TEST(uanci.args_called == 2u);
|
||||
|
||||
uanci = make_obj_using_allocator<uses_allocator_and_not_convertible_arg>(non_alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(uanci.allocator_called == false);
|
||||
BOOST_TEST(uanci.args_called == 3u);
|
||||
|
||||
uanci = make_obj_using_allocator<uses_allocator_and_not_convertible_arg>(non_alloc_arg_t(), arg1_t(), arg2_t());
|
||||
BOOST_TEST(uanci.allocator_called == false);
|
||||
BOOST_TEST(uanci.args_called == 2u);
|
||||
|
||||
////////////////////////////////////
|
||||
//uses_erased_type_allocator
|
||||
////////////////////////////////////
|
||||
uses_erased_type_allocator ueta = make_obj_using_allocator<uses_erased_type_allocator>(alloc_arg_t());
|
||||
BOOST_TEST(ueta.allocator_called == true);
|
||||
BOOST_TEST(ueta.args_called == 0u);
|
||||
|
||||
ueta = make_obj_using_allocator<uses_erased_type_allocator>(alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(ueta.allocator_called == true);
|
||||
BOOST_TEST(ueta.args_called == 3u);
|
||||
|
||||
ueta = make_obj_using_allocator<uses_erased_type_allocator>(alloc_arg_t(), arg1_t(), arg2_t());
|
||||
BOOST_TEST(ueta.allocator_called == true);
|
||||
BOOST_TEST(ueta.args_called == 2u);
|
||||
|
||||
ueta = make_obj_using_allocator<uses_erased_type_allocator>(non_alloc_arg_t(), arg1_t(), arg2_t());
|
||||
BOOST_TEST(ueta.allocator_called == false);
|
||||
BOOST_TEST(ueta.args_called == 2u);
|
||||
|
||||
ueta = make_obj_using_allocator<uses_erased_type_allocator>(non_alloc_arg_t(), arg1_t(), arg2_t(), arg3_t());
|
||||
BOOST_TEST(ueta.allocator_called == false);
|
||||
BOOST_TEST(ueta.args_called == 3u);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
//test_uninitialized_construct();
|
||||
test_make_obj();
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user