#include // std::aligned_storage_t #include #include "gtest/gtest.h" #include "libipc/utility/construct.h" #include "libipc/utility/pimpl.h" TEST(utility, construct) { struct Foo { int a_; short b_; char c_; }; std::aligned_storage_t foo; Foo *pfoo = ipc::construct(&foo, 123, short{321}, '1'); EXPECT_EQ(pfoo->a_, 123); EXPECT_EQ(pfoo->b_, 321); EXPECT_EQ(pfoo->c_, '1'); struct Bar : Foo { Bar(int a, short b, char c) : Foo{a, b, c} {} }; std::aligned_storage_t bar; Bar *pbar = ipc::construct(&bar, 123, short(321), '1'); EXPECT_EQ(pbar->a_, 123); EXPECT_EQ(pbar->b_, 321); EXPECT_EQ(pbar->c_, '1'); } namespace { struct Foo : ipc::pimpl::Obj { int *pi_; Foo(int *pi) : pi_(pi) {} }; struct Bar : ipc::pimpl::Obj { int *pi_; int *pj_; Bar(int *pi, int *pj) : pi_(pi), pj_(pj) {} }; } // namespace TEST(utility, pimpl_is_comfortable) { EXPECT_TRUE ((ipc::pimpl::is_comfortable::value)); EXPECT_TRUE ((ipc::pimpl::is_comfortable::value)); EXPECT_FALSE((ipc::pimpl::is_comfortable::value)); EXPECT_TRUE ((ipc::pimpl::is_comfortable::value)); EXPECT_FALSE((ipc::pimpl::is_comfortable::value)); } TEST(utility, pimpl_inherit) { int i = 123; Foo *pfoo = Foo::make(&i); EXPECT_EQ(ipc::pimpl::get(pfoo)->pi_, &i); pfoo->clear(); int j = 321; Bar *pbar = Bar::make(&i, &j); EXPECT_EQ(ipc::pimpl::get(pbar)->pi_, &i); EXPECT_EQ(ipc::pimpl::get(pbar)->pj_, &j); pbar->clear(); }