6#include "Stroika/Foundation/Memory/Common.h"
8namespace Stroika::Foundation::Memory {
15 template <
typename APPARENT_MEMBER_TYPE,
typename OUTER_OBJECT,
typename AGGREGATED_OBJECT_TYPE>
16 inline OUTER_OBJECT*
GetObjectOwningField (APPARENT_MEMBER_TYPE* aggregatedMember, AGGREGATED_OBJECT_TYPE (OUTER_OBJECT::* aggregatedPtrToMember))
20 byte* adjustedAggregatedMember =
reinterpret_cast<byte*
> (
static_cast<AGGREGATED_OBJECT_TYPE*
> (aggregatedMember));
21 ptrdiff_t adjustment =
static_cast<ptrdiff_t
> (OffsetOf (aggregatedPtrToMember));
22 return reinterpret_cast<OUTER_OBJECT*
> (adjustedAggregatedMember - adjustment);
24 template <
typename APPARENT_MEMBER_TYPE,
typename OUTER_OBJECT,
typename AGGREGATED_OBJECT_TYPE>
25 inline const OUTER_OBJECT* GetObjectOwningField (
const APPARENT_MEMBER_TYPE* aggregatedMember,
26 AGGREGATED_OBJECT_TYPE (OUTER_OBJECT::* aggregatedPtrToMember))
30 const byte* adjustedAggregatedMember =
reinterpret_cast<const byte*
> (
static_cast<const AGGREGATED_OBJECT_TYPE*
> (aggregatedMember));
31 ptrdiff_t adjustment =
static_cast<ptrdiff_t
> (OffsetOf (aggregatedPtrToMember));
32 return reinterpret_cast<const OUTER_OBJECT*
> (adjustedAggregatedMember - adjustment);
35 template <
typename OUTER_OBJECT,
typename DATA_MEMBER_TYPE>
36 [[deprecated (
"Since Stroika v3.0d2 - use Memory::OffsetOf()")]]
inline constexpr size_t
37 ConvertPointerToDataMemberToOffset (DATA_MEMBER_TYPE (OUTER_OBJECT::* dataMember))
39 return Memory::OffsetOf (dataMember);
#define RequireNotNull(p)
OUTER_OBJECT * GetObjectOwningField(APPARENT_MEMBER_TYPE *aggregatedMember, AGGREGATED_OBJECT_TYPE(OUTER_OBJECT::*aggregatedPtrToMember))