Skip to content

Commit e3b18f8

Browse files
committed
[UR] Check for if handle when type is complete
[UR] Remove is_type_complete check
1 parent 703c172 commit e3b18f8

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

scripts/templates/params.hpp.mako

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ def findMemberType(_item):
9494
</%def>
9595

9696
namespace ${x}_params {
97+
template <typename T> struct is_handle : std::false_type {};
98+
%for spec in specs:
99+
%for obj in spec['objects']:
100+
%if re.match(r"handle", obj['type']):
101+
template <> struct is_handle<${th.make_type_name(n, tags, obj)}> : std::true_type {};
102+
%endif
103+
%endfor
104+
%endfor
105+
template <typename T>
106+
inline constexpr bool is_handle_v = is_handle<T>::value;
97107
template <typename T> inline void serializePtr(std::ostream &os, T *ptr);
98108
template <typename T> inline void serializeFlag(std::ostream &os, uint32_t flag);
99109
template <typename T> inline void serializeTagged(std::ostream &os, const void *ptr, T value, size_t size);
@@ -351,12 +361,6 @@ inline std::ostream &operator<<(std::ostream &os, const struct ${th.make_pfncb_p
351361
%endfor
352362

353363
namespace ${x}_params {
354-
## This is needed to avoid dereferencing forward declared handles
355-
// https://devblogs.microsoft.com/oldnewthing/20190710-00/?p=102678
356-
template<typename, typename = void>
357-
constexpr bool is_type_complete_v = false;
358-
template<typename T>
359-
constexpr bool is_type_complete_v<T, std::void_t<decltype(sizeof(T))>> = true;
360364

361365
template <typename T> inline void serializePtr(std::ostream &os, T *ptr) {
362366
if (ptr == nullptr) {
@@ -365,7 +369,7 @@ template <typename T> inline void serializePtr(std::ostream &os, T *ptr) {
365369
os << (void *)(ptr) << " (";
366370
serializePtr(os, *ptr);
367371
os << ")";
368-
} else if constexpr (std::is_void_v<T> || !is_type_complete_v<T>) {
372+
} else if constexpr (std::is_void_v<T> || is_handle_v<T *>) {
369373
os << (void *)ptr;
370374
} else if constexpr (std::is_same_v<std::remove_cv_t< T >, char>) {
371375
os << (void *)(ptr) << " (";

source/common/ur_params.hpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,29 @@
1717
#include <ostream>
1818

1919
namespace ur_params {
20+
template <typename T> struct is_handle : std::false_type {};
21+
template <> struct is_handle<ur_loader_config_handle_t> : std::true_type {};
22+
template <> struct is_handle<ur_adapter_handle_t> : std::true_type {};
23+
template <> struct is_handle<ur_platform_handle_t> : std::true_type {};
24+
template <> struct is_handle<ur_device_handle_t> : std::true_type {};
25+
template <> struct is_handle<ur_context_handle_t> : std::true_type {};
26+
template <> struct is_handle<ur_event_handle_t> : std::true_type {};
27+
template <> struct is_handle<ur_program_handle_t> : std::true_type {};
28+
template <> struct is_handle<ur_kernel_handle_t> : std::true_type {};
29+
template <> struct is_handle<ur_queue_handle_t> : std::true_type {};
30+
template <> struct is_handle<ur_native_handle_t> : std::true_type {};
31+
template <> struct is_handle<ur_sampler_handle_t> : std::true_type {};
32+
template <> struct is_handle<ur_mem_handle_t> : std::true_type {};
33+
template <> struct is_handle<ur_physical_mem_handle_t> : std::true_type {};
34+
template <> struct is_handle<ur_usm_pool_handle_t> : std::true_type {};
35+
template <> struct is_handle<ur_exp_image_handle_t> : std::true_type {};
36+
template <> struct is_handle<ur_exp_image_mem_handle_t> : std::true_type {};
37+
template <> struct is_handle<ur_exp_interop_mem_handle_t> : std::true_type {};
38+
template <>
39+
struct is_handle<ur_exp_interop_semaphore_handle_t> : std::true_type {};
40+
template <>
41+
struct is_handle<ur_exp_command_buffer_handle_t> : std::true_type {};
42+
template <typename T> inline constexpr bool is_handle_v = is_handle<T>::value;
2043
template <typename T> inline void serializePtr(std::ostream &os, T *ptr);
2144
template <typename T>
2245
inline void serializeFlag(std::ostream &os, uint32_t flag);
@@ -15268,10 +15291,6 @@ operator<<(std::ostream &os,
1526815291
}
1526915292

1527015293
namespace ur_params {
15271-
// https://devblogs.microsoft.com/oldnewthing/20190710-00/?p=102678
15272-
template <typename, typename = void> constexpr bool is_type_complete_v = false;
15273-
template <typename T>
15274-
constexpr bool is_type_complete_v<T, std::void_t<decltype(sizeof(T))>> = true;
1527515294

1527615295
template <typename T> inline void serializePtr(std::ostream &os, T *ptr) {
1527715296
if (ptr == nullptr) {
@@ -15280,7 +15299,7 @@ template <typename T> inline void serializePtr(std::ostream &os, T *ptr) {
1528015299
os << (void *)(ptr) << " (";
1528115300
serializePtr(os, *ptr);
1528215301
os << ")";
15283-
} else if constexpr (std::is_void_v<T> || !is_type_complete_v<T>) {
15302+
} else if constexpr (std::is_void_v<T> || is_handle_v<T *>) {
1528415303
os << (void *)ptr;
1528515304
} else if constexpr (std::is_same_v<std::remove_cv_t<T>, char>) {
1528615305
os << (void *)(ptr) << " (";

0 commit comments

Comments
 (0)