#ifndef ra_util_parent_from_member_hpp #define ra_util_parent_from_member_hpp /* SENG 475 University of Victoria, Victoria, Canada Michael Adams This file contains some nonportable code for determining a parent object from a pointer to one of its members. */ #include namespace ra::util { template inline std::ptrdiff_t offset_from_pointer_to_member( const Member Parent::* ptr_to_member) { const Parent * const parent = 0; const char * const member = static_cast( static_cast(&(parent->*ptr_to_member))); return std::ptrdiff_t(member - static_cast( static_cast(parent))); } template inline Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member) { return static_cast(static_cast( static_cast(static_cast(member)) - offset_from_pointer_to_member(ptr_to_member))); } template inline const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member) { return static_cast(static_cast( static_cast(static_cast(member)) - offset_from_pointer_to_member(ptr_to_member))); } } #endif