Skip to content

Instantly share code, notes, and snippets.

@ChemistAion
Created March 19, 2019 20:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChemistAion/05fa1c4477fa0524ac8f93b5ce36d077 to your computer and use it in GitHub Desktop.
Save ChemistAion/05fa1c4477fa0524ac8f93b5ce36d077 to your computer and use it in GitHub Desktop.
Type Reference Decay tests...
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
struct TestStructure
{
int number = 42;
};
////////////////////////////////////////////////////////////////////////////////
template <typename Type>
auto SimpleTypeRefDecay(Type& type)
{
return std::remove_reference_t<Type>(type);
}
////////////////////////////////////////////////////////////////////////////////
TEST_F(Serializer, SimpleTypeRefDecay)
{
TestStructure test;
auto& simple = test;
auto wrapper = std::reference_wrapper<TestStructure>(test);
auto result1 = SimpleTypeRefDecay(test);
auto result2 = SimpleTypeRefDecay(simple);
auto result3 = SimpleTypeRefDecay(wrapper);
test.number = 0;
ASSERT_EQ(result1.number, 42);
ASSERT_EQ(result2.number, 42);
ASSERT_EQ(result3.get().number, 42); //fail! it is sill a 'reference' to test
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template <class Type>
struct DecayReferenceWrapper
{
using type = Type;
};
template <class Type>
struct DecayReferenceWrapper<std::reference_wrapper<Type>>
{
using type = Type;
};
template <class Type>
using DecayReferenceWrapperType = typename DecayReferenceWrapper<Type>::type;
////////////////////////////////////////////////////////////////////////////////
template <typename Type>
auto FullTypeRefDecay(Type& type)
{
return DecayReferenceWrapperType<std::remove_reference_t<Type>>(type);
}
////////////////////////////////////////////////////////////////////////////////
TEST_F(Serializer, FullTypeRefDecay)
{
TestStructure test;
auto& simple = test;
auto wrapper = std::reference_wrapper<TestStructure>(test);
auto result1 = FullTypeRefDecay(test);
auto result2 = FullTypeRefDecay(simple);
auto result3 = FullTypeRefDecay(wrapper);
test.number = 0;
ASSERT_EQ(result1.number, 42);
ASSERT_EQ(result2.number, 42);
ASSERT_EQ(result3.number, 42); //now it is OK
return;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment