Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
ObjectFieldUtilities.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
5
6#include "Stroika/Foundation/Memory/Common.h"
7
8namespace Stroika::Foundation::Memory {
9
10 /*
11 ********************************************************************************
12 *************************** GetObjectOwningField *******************************
13 ********************************************************************************
14 */
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))
17 {
18 RequireNotNull (aggregatedMember);
19 RequireNotNull (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);
23 }
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))
27 {
28 RequireNotNull (aggregatedMember);
29 RequireNotNull (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);
33 }
34
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))
38 {
39 return Memory::OffsetOf (dataMember);
40 }
41
42}
#define RequireNotNull(p)
Definition Assertions.h:347
OUTER_OBJECT * GetObjectOwningField(APPARENT_MEMBER_TYPE *aggregatedMember, AGGREGATED_OBJECT_TYPE(OUTER_OBJECT::*aggregatedPtrToMember))