#include #include namespace NYT { namespace { //////////////////////////////////////////////////////////////////////////////// enum EFuncResult { Base, ConstBase, Derived, ConstDerived, }; enum EBinaryFuncResult { Ok, NotOk, }; struct TBase { }; struct TDerived : public TBase { }; EFuncResult Foo(TNonNullPtr /*base*/) { return EFuncResult::Base; } EFuncResult Foo(TNonNullPtr /*base*/) { return EFuncResult::ConstBase; } EFuncResult Foo(TNonNullPtr /*derived*/) { return EFuncResult::Derived; } EFuncResult Foo(TNonNullPtr /*derived*/) { return EFuncResult::ConstDerived; } [[maybe_unused]] EBinaryFuncResult Foo(int* /*derived*/) { return EBinaryFuncResult::NotOk; } EBinaryFuncResult Foo(TNonNullPtr /*derived*/) { return EBinaryFuncResult::Ok; } EBinaryFuncResult Bar(TNonNullPtr /*arg*/) { return EBinaryFuncResult::Ok; } EBinaryFuncResult Baz(TNonNullPtr /*arg*/) { return EBinaryFuncResult::Ok; } TEST(TNonNullPtrTest, Simple) { TDerived derived{}; const auto& constDerived = derived; EXPECT_EQ(EFuncResult::Derived, Foo(GetPtr(derived))); EXPECT_EQ(EFuncResult::ConstDerived, Foo(GetPtr(constDerived))); TBase base{}; const auto& constBase = base; EXPECT_EQ(EFuncResult::Base, Foo(GetPtr(base))); EXPECT_EQ(EFuncResult::ConstBase, Foo(GetPtr(constBase))); int i{}; EXPECT_EQ(EBinaryFuncResult::Ok, Foo(GetPtr(i))); } TEST(TNonNullPtrTest, CastToConst) { int i{}; EXPECT_EQ(EBinaryFuncResult::Ok, Bar(GetPtr(i))); } TEST(TNonNullPtrTest, ConstructionFromRawPointer) { int i{}; EXPECT_EQ(EBinaryFuncResult::Ok, Baz(&i)); } //////////////////////////////////////////////////////////////////////////////// } // namespace } // namespace NYT