Skip to content

Commit 10b757f

Browse files
Make properties::get_property static for compile-time properties
1 parent 38ee5e8 commit 10b757f

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

sycl/include/sycl/ext/oneapi/properties/properties.hpp

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,32 @@ class __SYCL_EBO
220220
properties>;
221221
}
222222

223-
template <typename property_key_t> constexpr auto get_property() {
223+
// Two methods below do the following (pseudocode):
224+
//
225+
// template <property_key_t>
226+
// using ret_t = decltype(this->get_property(key_tag<property_key_t>{}));
227+
// static constexpr auto get_property() requires(is_empty_v<ret_t>) {
228+
// return ret_t{};
229+
// }
230+
// constexpr auto get_property() requires(!is_empty_v<ret_t>) {
231+
// return get_property(key_tag<property_key_t>{});
232+
// }
233+
template <typename property_key_t>
234+
static constexpr auto get_property() -> std::enable_if_t<
235+
std::is_empty_v<decltype(std::declval<properties>().get_property(
236+
detail::property_key_tag<property_key_t>{}))>,
237+
decltype(std::declval<properties>().get_property(
238+
detail::property_key_tag<property_key_t>{}))> {
239+
return decltype(std::declval<properties>().get_property(
240+
detail::property_key_tag<property_key_t>{})){};
241+
}
242+
243+
template <typename property_key_t>
244+
constexpr auto get_property() const -> std::enable_if_t<
245+
!std::is_empty_v<decltype(std::declval<properties>().get_property(
246+
detail::property_key_tag<property_key_t>{}))>,
247+
decltype(std::declval<properties>().get_property(
248+
detail::property_key_tag<property_key_t>{}))> {
224249
return get_property(detail::property_key_tag<property_key_t>{});
225250
}
226251

sycl/test/extensions/properties/new_properties.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,18 @@ void test() {
159159
}
160160
} // namespace test_compile_prop_in_runtime_list
161161

162+
namespace test_static_get_property {
163+
struct ct_prop : named_property_base<ct_prop> {};
164+
struct rt_prop : named_property_base<rt_prop> {
165+
int x;
166+
};
167+
void test() {
168+
properties pl{ct_prop{}, rt_prop{}};
169+
constexpr auto c = decltype(pl)::get_property<ct_prop>();
170+
auto r = pl.get_property<rt_prop>();
171+
}
172+
}
173+
162174
int main() {
163175
test::test();
164176
bench::test(std::make_integer_sequence<int, 67>{});

0 commit comments

Comments
 (0)