xref: /openbmc/libpldm/include/libpldm++/types.hpp (revision d6a957481638b00a49aed15d04b60d3d32fede54)
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