blob: 03910452a60d592ffae365c27d75a9e01a1d6841 [file] [log] [blame]
/////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2014-2014
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/intrusive for documentation.
//
/////////////////////////////////////////////////////////////////////////////
#include <boost/intrusive/parent_from_member.hpp>
#include <boost/core/lightweight_test.hpp>
struct POD
{
int int_;
float float_;
}pod;
struct Derived
: public POD
{
int derived_int_;
float derived_float_;
}derived;
struct Abstract
{
int abstract_int_;
float abstract_float_;
virtual void virtual_func1() = 0;
virtual void virtual_func2() = 0;
virtual ~Abstract(){}
};
struct DerivedPoly
: public Abstract
{
int derivedpoly_int_;
float derivedpoly_float_;
virtual void virtual_func1(){}
virtual void virtual_func2(){}
Abstract *abstract() { return this; }
Abstract const *abstract() const { return this; }
} derivedpoly;
struct MultiInheritance
: public Derived, public DerivedPoly
{
int multiinheritance_int_;
float multiinheritance_float_;
} multiinheritance;
struct Abstract2
{
int abstract2_int_;
float abstract2_float_;
virtual void virtual_func1() = 0;
virtual void virtual_func2() = 0;
virtual ~Abstract2(){}
};
struct DerivedPoly2
: public Abstract2
{
int derivedpoly2_int_;
float derivedpoly2_float_;
virtual void virtual_func1(){}
virtual void virtual_func2(){}
Abstract2 *abstract2() { return this; }
Abstract2 const *abstract2() const { return this; }
} derivedpoly2;
struct MultiInheritance2
: public DerivedPoly, public DerivedPoly2
{
int multiinheritance2_int_;
float multiinheritance2_float_;
} multiinheritance2;
struct VirtualDerived
: public virtual Derived
{
int virtualderived_int_;
float virtualderived_float_;
virtual void f1(){}
virtual void f2(){}
} virtualderived;
struct VirtualMultipleDerived
: public virtual Derived, virtual public DerivedPoly
{
int virtualmultiplederived_int_;
float virtualmultiplederived_float_;
virtual void f1(){}
virtual void f2(){}
} virtualmultiplederived;
using namespace boost::intrusive;
int main()
{
//POD
BOOST_TEST(&pod == get_parent_from_member(&pod.int_, &POD::int_));
BOOST_TEST(&pod == get_parent_from_member(&pod.float_, &POD::float_));
//Derived
BOOST_TEST(&derived == get_parent_from_member(&derived.int_, &Derived::int_));
BOOST_TEST(&derived == get_parent_from_member(&derived.float_, &Derived::float_));
BOOST_TEST(&derived == get_parent_from_member(&derived.derived_int_, &Derived::derived_int_));
BOOST_TEST(&derived == get_parent_from_member(&derived.derived_float_, &Derived::derived_float_));
//Abstract
BOOST_TEST(derivedpoly.abstract() == get_parent_from_member(&derivedpoly.abstract_int_, &Abstract::abstract_int_));
BOOST_TEST(derivedpoly.abstract() == get_parent_from_member(&derivedpoly.abstract_float_, &Abstract::abstract_float_));
//DerivedPoly
BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.abstract_int_, &DerivedPoly::abstract_int_));
BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.abstract_float_, &DerivedPoly::abstract_float_));
BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.derivedpoly_int_, &DerivedPoly::derivedpoly_int_));
BOOST_TEST(&derivedpoly == get_parent_from_member(&derivedpoly.derivedpoly_float_, &DerivedPoly::derivedpoly_float_));
//MultiInheritance
BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_int_, &MultiInheritance::abstract_int_));
BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_float_, &MultiInheritance::abstract_float_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_int_, &MultiInheritance::derivedpoly_int_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_float_, &MultiInheritance::derivedpoly_float_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.int_, &MultiInheritance::int_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.float_, &MultiInheritance::float_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derived_int_, &MultiInheritance::derived_int_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derived_float_, &MultiInheritance::derived_float_));
BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_int_, &MultiInheritance::abstract_int_));
BOOST_TEST(multiinheritance.abstract() == get_parent_from_member(&multiinheritance.abstract_float_, &MultiInheritance::abstract_float_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_int_, &MultiInheritance::derivedpoly_int_));
BOOST_TEST(&multiinheritance == get_parent_from_member(&multiinheritance.derivedpoly_float_, &MultiInheritance::derivedpoly_float_));
BOOST_TEST(multiinheritance2.abstract2() == get_parent_from_member(&multiinheritance2.abstract2_int_, &MultiInheritance2::abstract2_int_));
BOOST_TEST(multiinheritance2.abstract2() == get_parent_from_member(&multiinheritance2.abstract2_float_, &MultiInheritance2::abstract2_float_));
BOOST_TEST(&multiinheritance2 == get_parent_from_member(&multiinheritance2.derivedpoly2_int_, &MultiInheritance2::derivedpoly2_int_));
BOOST_TEST(&multiinheritance2 == get_parent_from_member(&multiinheritance2.derivedpoly2_float_, &MultiInheritance2::derivedpoly2_float_));
//MSVC pointer to member data uses RTTI info even when not crossing virtual base boundaries
#ifdef BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
//No access to virtual base data {int_, float_, derived_int_, derived_float_}
BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_int_, &VirtualDerived::virtualderived_int_));
BOOST_TEST(&virtualderived == get_parent_from_member(&virtualderived.virtualderived_float_, &VirtualDerived::virtualderived_float_));
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.virtualmultiplederived_float_, &VirtualMultipleDerived::virtualmultiplederived_float_));
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.virtualmultiplederived_int_, &VirtualMultipleDerived::virtualmultiplederived_int_));
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.derivedpoly_float_, &VirtualMultipleDerived::derivedpoly_float_));
BOOST_TEST(&virtualmultiplederived == get_parent_from_member(&virtualmultiplederived.derivedpoly_int_, &VirtualMultipleDerived::derivedpoly_int_));
#endif
return boost::report_errors();
}