File indexing completed on 2025-07-11 08:14:01
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP
0013 #define BOOST_INTRUSIVE_DETAIL_PARENT_FROM_MEMBER_HPP
0014
0015 #ifndef BOOST_CONFIG_HPP
0016 # include <boost/config.hpp>
0017 #endif
0018
0019 #if defined(BOOST_HAS_PRAGMA_ONCE)
0020 # pragma once
0021 #endif
0022
0023 #include <boost/intrusive/detail/config_begin.hpp>
0024 #include <boost/intrusive/detail/workaround.hpp>
0025 #include <cstddef>
0026
0027 #if defined(_MSC_VER)
0028 #define BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER
0029 #endif
0030
0031 namespace boost {
0032 namespace intrusive {
0033 namespace detail {
0034
0035 template<class Parent, class Member>
0036 BOOST_INTRUSIVE_FORCEINLINE std::ptrdiff_t offset_from_pointer_to_member(const Member Parent::* ptr_to_member)
0037 {
0038
0039 #if defined(BOOST_INTRUSIVE_MSVC_ABI_PTR_TO_MEMBER)
0040
0041
0042 union caster_union
0043 {
0044 const Member Parent::* ptr_to_member;
0045 int offset;
0046 } caster;
0047
0048
0049
0050
0051 BOOST_INTRUSIVE_STATIC_ASSERT( sizeof(caster) == sizeof(int) );
0052
0053 caster.ptr_to_member = ptr_to_member;
0054 return std::ptrdiff_t(caster.offset);
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073 #elif defined(__GNUC__) || defined(__HP_aCC) || defined(BOOST_INTEL) || \
0074 defined(__IBMCPP__) || defined(__DECCXX)
0075 const Parent * const parent = 0;
0076 const char *const member = static_cast<const char*>(static_cast<const void*>(&(parent->*ptr_to_member)));
0077 return std::ptrdiff_t(member - static_cast<const char*>(static_cast<const void*>(parent)));
0078 #else
0079
0080 union caster_union
0081 {
0082 const Member Parent::* ptr_to_member;
0083 std::ptrdiff_t offset;
0084 } caster;
0085 caster.ptr_to_member = ptr_to_member;
0086 return caster.offset - 1;
0087 #endif
0088 }
0089
0090 template<class Parent, class Member>
0091 BOOST_INTRUSIVE_FORCEINLINE Parent *parent_from_member(Member *member, const Member Parent::* ptr_to_member)
0092 {
0093 return reinterpret_cast<Parent*>
0094 (reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)));
0095 }
0096
0097 template<class Parent, class Member>
0098 BOOST_INTRUSIVE_FORCEINLINE const Parent *parent_from_member(const Member *member, const Member Parent::* ptr_to_member)
0099 {
0100 return reinterpret_cast<const Parent*>
0101 ( reinterpret_cast<std::size_t>(member) - static_cast<std::size_t>(offset_from_pointer_to_member(ptr_to_member)) );
0102 }
0103
0104 }
0105 }
0106 }
0107
0108 #include <boost/intrusive/detail/config_end.hpp>
0109
0110 #endif