Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
StructFieldMetaInfo.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/Memory/Common.h"
5
7
8 /*
9 ********************************************************************************
10 **************************** StructFieldMetaInfo *******************************
11 ********************************************************************************
12 */
13 template <typename FIELD_VALUE_TYPE, typename OWNING_OBJECT>
14 inline StructFieldMetaInfo::StructFieldMetaInfo (FIELD_VALUE_TYPE OWNING_OBJECT::* member)
15 : fTypeInfo_{typeid (FIELD_VALUE_TYPE)}
16 {
17 fPTR2MEM_.push_back (as_bytes (span{&member, 1}));
18 Assert (fPTR2MEM_.size () <= 2 * sizeof (void*)); // not required - just a tmphack to test/verify
19 }
20 inline type_index StructFieldMetaInfo::GetTypeInfo () const
21 {
22 return fTypeInfo_;
23 }
24 template <typename FIELD_VALUE_TYPE, typename OWNING_OBJECT>
25 inline const FIELD_VALUE_TYPE* StructFieldMetaInfo::GetAddressOfMember (const OWNING_OBJECT* object) const
26 {
27 auto p2m = GetP2M_<FIELD_VALUE_TYPE, OWNING_OBJECT> ();
28 return &(object->*p2m);
29 }
30 template <typename FIELD_VALUE_TYPE, typename OWNING_OBJECT>
31 inline FIELD_VALUE_TYPE* StructFieldMetaInfo::GetAddressOfMember (OWNING_OBJECT* object) const
32 {
33 auto p2m = GetP2M_<FIELD_VALUE_TYPE, OWNING_OBJECT> ();
34 return &(object->*p2m);
35 }
36 template <typename OWNING_OBJECT>
37 inline const byte* StructFieldMetaInfo::GetAddressOfMember (const OWNING_OBJECT* object) const
38 {
39 return GetAddressOfMember<byte, OWNING_OBJECT> (object); // unsafe case (see comments in method description)
40 }
41 template <typename OWNING_OBJECT>
42 inline byte* StructFieldMetaInfo::GetAddressOfMember (OWNING_OBJECT* object) const
43 {
44 return GetAddressOfMember<byte, OWNING_OBJECT> (object); // unsafe case (see comments in method description)
45 }
46 inline strong_ordering StructFieldMetaInfo::operator<=> (const StructFieldMetaInfo& rhs) const
47 {
48 strong_ordering r = Memory::CompareBytes (span{this->fPTR2MEM_}, span{rhs.fPTR2MEM_});
49 if (r == strong_ordering::equal) {
50 if (fTypeInfo_ < rhs.fTypeInfo_) {
51 r = strong_ordering::less;
52 }
53 else if (fTypeInfo_ == rhs.fTypeInfo_) {
54 r = strong_ordering::equal;
55 }
56 else {
57 r = strong_ordering::greater;
58 }
59 }
60 return r;
61 }
62 inline bool StructFieldMetaInfo::operator== (const StructFieldMetaInfo& rhs) const
63 {
64 return fTypeInfo_ == rhs.fTypeInfo_ and Memory::CompareBytes (span{this->fPTR2MEM_}, span{rhs.fPTR2MEM_}) == strong_ordering::equal;
65 }
66 template <typename FIELD_VALUE_TYPE, typename OWNING_OBJECT>
67 inline FIELD_VALUE_TYPE OWNING_OBJECT ::* const StructFieldMetaInfo::GetP2M_ () const
68 {
69 Require (sizeof (const FIELD_VALUE_TYPE OWNING_OBJECT::*) == fPTR2MEM_.size ());
70 using X = FIELD_VALUE_TYPE OWNING_OBJECT::* const;
71 X* aaa = reinterpret_cast<X*> (fPTR2MEM_.data ());
72 return *aaa;
73 // return *(X*)(fPTR2MEM_.data ());
74 }
75
76}
nonvirtual pointer data() noexcept
returns a (possibly const) pointer to the start of the live buffer data. This return value can be inv...
nonvirtual void push_back(Common::ArgByValueType< T > e)
nonvirtual size_t size() const noexcept
nonvirtual const FIELD_VALUE_TYPE * GetAddressOfMember(const OWNING_OBJECT *object) const
StructFieldMetaInfo(FIELD_VALUE_TYPE OWNING_OBJECT::*member)