@@ -39,32 +39,50 @@ class queue;
39
39
40
40
namespace detail {
41
41
42
+ // Used to represent a type of an extended member
42
43
enum class ExtendedMembersType : unsigned int {
43
44
HANDLER_KERNEL_BUNDLE = 0 ,
44
45
};
45
46
46
- struct ExtendedMember {
47
+ // Holds a pointer to an object of an arbitrary type and an ID value which
48
+ // should be used to understand what type pointer points to.
49
+ // Used as to extend handler class without introducing new class members which
50
+ // would change handler layout.
51
+ struct ExtendedMemberT {
47
52
ExtendedMembersType MType;
48
53
std::shared_ptr<void > MData;
49
54
};
50
55
51
- static std::shared_ptr<std::vector<ExtendedMember >>
56
+ static std::shared_ptr<std::vector<ExtendedMemberT >>
52
57
convertToExtendedMembers (const std::shared_ptr<const void > &SPtr) {
53
- return std::const_pointer_cast<std::vector<ExtendedMember >>(
54
- std::static_pointer_cast<const std::vector<ExtendedMember >>(SPtr));
58
+ return std::const_pointer_cast<std::vector<ExtendedMemberT >>(
59
+ std::static_pointer_cast<const std::vector<ExtendedMemberT >>(SPtr));
55
60
}
56
61
57
62
class stream_impl ;
58
63
class queue_impl ;
59
64
class kernel_bundle_impl ;
60
65
66
+ // The version of CG type is encoded in the higher byte of the value:
67
+ //
68
+ // 0x00000001 - CG type KERNEL version 0
69
+ // 0x01000001 - CG type KERNEL version 1
70
+ // /\
71
+ // ||
72
+ // The byte describes the version
73
+ //
74
+ // The constant is used to shift left CG type value to access it's version
75
+ constexpr unsigned int ShiftBitsForVersion = 24 ;
76
+
77
+ // Constructs versioned type
61
78
constexpr static unsigned int getVersionedCGType (unsigned int Type,
62
79
unsigned char Version) {
63
- return Type | ((unsigned int )Version << 24 );
80
+ return Type | ((unsigned int )Version << ShiftBitsForVersion );
64
81
}
65
82
83
+ // Returns the version encoded to the type
66
84
constexpr static unsigned char getCGTypeVersion (unsigned int Type) {
67
- return Type >> 24 ;
85
+ return Type >> ShiftBitsForVersion ;
68
86
}
69
87
70
88
// / Base class for all types of command groups.
@@ -120,7 +138,7 @@ class CG {
120
138
121
139
CGTYPE getType () { return MType; }
122
140
123
- std::shared_ptr<std::vector<ExtendedMember >> getExtendedMembers () {
141
+ std::shared_ptr<std::vector<ExtendedMemberT >> getExtendedMembers () {
124
142
if (getCGTypeVersion (MType) == CG_VERSION::V0 || MSharedPtrStorage.empty ())
125
143
return nullptr ;
126
144
@@ -195,11 +213,11 @@ class CGExecKernel : public CG {
195
213
}
196
214
197
215
std::shared_ptr<detail::kernel_bundle_impl> getKernelBundle () {
198
- const std::shared_ptr<std::vector<ExtendedMember >> &ExtendedMembers =
216
+ const std::shared_ptr<std::vector<ExtendedMemberT >> &ExtendedMembers =
199
217
getExtendedMembers ();
200
218
if (!ExtendedMembers)
201
219
return nullptr ;
202
- for (const ExtendedMember &EMember : *ExtendedMembers)
220
+ for (const ExtendedMemberT &EMember : *ExtendedMembers)
203
221
if (ExtendedMembersType::HANDLER_KERNEL_BUNDLE == EMember.MType )
204
222
return std::static_pointer_cast<detail::kernel_bundle_impl>(
205
223
EMember.MData );
0 commit comments