1 #pragma once 2 3 #include <bitset> 4 #include <cstdint> 5 #include <libpldm/firmware_update.h> 6 #include <map> 7 #include <memory> 8 #include <string> 9 #include <vector> 10 #include <optional> 11 12 // namespace libpldm is for things which are not directly related to PLDM specifications 13 namespace libpldm 14 { 15 // define this base class to avoid library users having 16 // copy constructors and move constructors auto-generated, which could mismatch 17 // with the library ABI 18 struct NonCopyableNonMoveable { 19 NonCopyableNonMoveable() = default; 20 NonCopyableNonMoveable(const NonCopyableNonMoveable &) = delete; 21 NonCopyableNonMoveable & 22 operator=(const NonCopyableNonMoveable &) = delete; 23 NonCopyableNonMoveable(NonCopyableNonMoveable &&) = delete; 24 NonCopyableNonMoveable &operator=(NonCopyableNonMoveable &&) = delete; 25 26 protected: 27 ~NonCopyableNonMoveable() = default; 28 }; 29 30 // note (does not apply to library users): 31 // users of derived classes must use 'HasMember' functions 32 // before read/write member access to fields 33 template <class Derived> struct GrowableStruct { 34 protected: 35 // size of the derived class in bytes 36 const size_t struct_size = sizeof(Derived); 37 38 // reserved for future use 39 uint64_t reserved_1 = 0; 40 addresslibpldm::GrowableStruct41 char *address() const 42 { 43 return (char *)this; 44 } 45 HasMemberlibpldm::GrowableStruct46 template <class T> bool HasMember(const T Derived::*member) const 47 { 48 return struct_size > 49 (char *)&(static_cast<const Derived *>(this)->*member) - 50 address(); 51 } 52 53 // checked access 54 template <class T> CompareEQlibpldm::GrowableStruct55 bool CompareEQ(const T Derived::*member, const Derived &other) const 56 { 57 if (HasMember(member) && !other.HasMember(member)) { 58 return false; 59 } 60 if (!HasMember(member) && other.HasMember(member)) { 61 return false; 62 } 63 if (!HasMember(member) && !other.HasMember(member)) { 64 return true; 65 } 66 67 return *(GetPtr(member)) == *(other.GetPtr(member)); 68 } 69 70 // checked access 71 template <class T> CompareNEQlibpldm::GrowableStruct72 bool CompareNEQ(const T Derived::*member, const Derived &other) const 73 { 74 if (HasMember(member) && !other.HasMember(member)) { 75 return true; 76 } 77 if (!HasMember(member) && other.HasMember(member)) { 78 return true; 79 } 80 if (!HasMember(member) && !other.HasMember(member)) { 81 return false; 82 } 83 84 return *(GetPtr(member)) != *(other.GetPtr(member)); 85 } 86 87 private: 88 // unchecked access Getlibpldm::GrowableStruct89 template <class T> T Get(const T Derived::*member) const 90 { 91 return static_cast<const Derived *>(this)->*member; 92 } 93 94 // unchecked access GetPtrlibpldm::GrowableStruct95 template <class T> const T *GetPtr(const T Derived::*member) const 96 { 97 return &((static_cast<const Derived *>(this))->*member); 98 } 99 }; 100 101 } // namespace libpldm 102