#include "store_policy.h" #include #include Y_UNIT_TEST_SUITE(StorePolicy) { Y_UNIT_TEST(Compileability) { // construction TAutoEmbedOrPtrPolicy>(MakeHolder(1)); TAutoEmbedOrPtrPolicy>(TVector{1, 2, 3}); auto a = MakeHolder(42); TAutoEmbedOrPtrPolicy&>{a}; // const (**TAutoEmbedOrPtrPolicy>(MakeHolder(1)).Ptr())++; // ok (**TAutoEmbedOrPtrPolicy&>(a).Ptr())++; // ok const TVector b = {0}; auto bValue = (*TAutoEmbedOrPtrPolicy&>(b).Ptr())[0]; // ok // (*TAutoEmbedOrPtrPolicy&>(b).Ptr())[0]++; // not ok Y_UNUSED(bValue); } template void FunctionTakingRefDefaultIsObject(T&& a, TFunc func) { TAutoEmbedOrPtrPolicy refHolder(a); func(refHolder); } Y_UNIT_TEST(Reference) { { TVector a = {1, 2, 3}; FunctionTakingRefDefaultIsObject(a, [](auto& holder) { holder.Ptr()->push_back(4); auto secondHolder = holder; secondHolder.Ptr()->push_back(5); }); UNIT_ASSERT_VALUES_EQUAL(a.size(), 5); } { const TVector a = {1, 2, 3}; static_assert(std::is_const::value); FunctionTakingRefDefaultIsObject(a, [](auto& holder) { static_assert(std::is_const>::value); UNIT_ASSERT_VALUES_EQUAL(holder.Ptr()->size(), 3); }); } } template void FunctionTakingObjectDefaultObject(T&& a, TFunc func) { TAutoEmbedOrPtrPolicy objectHolder(std::forward(a)); func(objectHolder); } Y_UNIT_TEST(Object) { TVector a = {1, 2, 3}; FunctionTakingObjectDefaultObject(std::move(a), [&a](auto& holder) { static_assert(std::is_copy_assignable::value); UNIT_ASSERT_VALUES_EQUAL(a.size(), 0); UNIT_ASSERT_VALUES_EQUAL(holder.Ptr()->size(), 3); holder.Ptr()->push_back(4); auto secondHolder = holder; secondHolder.Ptr()->push_back(5); UNIT_ASSERT_VALUES_EQUAL(holder.Ptr()->size(), 4); UNIT_ASSERT_VALUES_EQUAL(secondHolder.Ptr()->size(), 5); }); UNIT_ASSERT_VALUES_EQUAL(a.size(), 0); THolder b = MakeHolder(42); FunctionTakingObjectDefaultObject(std::move(b), [](auto& holder) { static_assert(!std::is_copy_assignable::value); UNIT_ASSERT_VALUES_EQUAL(**holder.Ptr(), 42); auto secondHolder = std::move(holder); UNIT_ASSERT(!*holder.Ptr()); UNIT_ASSERT_VALUES_EQUAL(**secondHolder.Ptr(), 42); }); } }