parent_from_member.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 71 行

HPP
71
字号
///////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga  2007//// 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.///////////////////////////////////////////////////////////////////////////////#ifndef BOOST_INTRUSIVE_PARENT_FROM_MEMBER_HPP#define BOOST_INTRUSIVE_PARENT_FROM_MEMBER_HPP#include <boost/intrusive/detail/config_begin.hpp>#include <cstddef>#if defined(BOOST_MSVC) || (defined (BOOST_WINDOWS) && defined(BOOST_INTEL))#define BOOST_INTRUSIVE_MSVC_COMPLIANT_PTR_TO_MEMBER#include <boost/cstdint.hpp>#endifnamespace boost {namespace intrusive {namespace detail {template<class Parent, class Member>inline std::ptrdiff_t offset_from_pointer_to_member(const Member Parent::* ptr_to_member){   //The implementation of a pointer to member is compiler dependent.   #if defined(BOOST_INTRUSIVE_MSVC_COMPLIANT_PTR_TO_MEMBER)   //msvc compliant compilers use their the first 32 bits as offset (even in 64 bit mode)   return *(const boost::int32_t*)(void*)&ptr_to_member;   //This works with gcc, msvc, ac++, ibmcpp   #elif defined(__GNUC__)   || defined(__HP_aCC) || defined(BOOST_INTEL) || \         defined(__IBMCPP__) || defined(__DECCXX)   const Parent * const parent = 0;   const char *const member = reinterpret_cast<const char*>(&(parent->*ptr_to_member));   return std::ptrdiff_t(member - reinterpret_cast<const char*>(parent));   #else   //This is the traditional C-front approach: __MWERKS__, __DMC__, __SUNPRO_CC   return (*(const std::ptrdiff_t*)(void*)&ptr_to_member) - 1;   #endif}template<class Parent, class Member>inline Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member){   return (Parent*)((char*)member -       offset_from_pointer_to_member(ptr_to_member));}template<class Parent, class Member>inline const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member){   return (const Parent*)((const char*)member -       offset_from_pointer_to_member(ptr_to_member));}}  //namespace detail {}  //namespace intrusive {}  //namespace boost {#ifdef BOOST_INTRUSIVE_MSVC_COMPLIANT_PTR_TO_MEMBER#undef BOOST_INTRUSIVE_MSVC_COMPLIANT_PTR_TO_MEMBER#endif#include <boost/intrusive/detail/config_end.hpp>#endif   //#ifndef BOOST_INTRUSIVE_PARENT_FROM_MEMBER_HPP

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?