Monado OpenXR Runtime
xrt_future_value.h
Go to the documentation of this file.
1// Copyright 2025, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Variant/algebraic data-type for holding the values of xrt_futures
6 * @author Korcan Hussein <korcan.hussein@collabora.com>
7 *
8 * @see xrt_future, xrt_future_result
9 *
10 * @ingroup xrt_iface
11 */
12#pragma once
13
14#include "xrt/xrt_compiler.h"
15#include "xrt/xrt_defines.h"
16
17#include <assert.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23// X-Macro type definitions: typename/prefix, type, member, user-data
24#define XRT_FUTURE_VALUE_TYPES_WITH(_, P) \
25 _(UINT64, uint64_t, uint64_, P) \
26 _(INT64, int64_t, int64_, P)
27
28#define XRT_FUTURE_VALUE_WRAP_MACRO(N, T, M, X) X(N, T, M)
29
30#define XRT_FUTURE_VALUE_TYPES(X) XRT_FUTURE_VALUE_TYPES_WITH(XRT_FUTURE_VALUE_WRAP_MACRO, X)
31
32typedef enum xrt_future_value_type
33{
34 XRT_FUTURE_VALUE_TYPE_NONE,
35
36#define X_ENUM_ENTRY(TYPE_NAME, T, M) XRT_FUTURE_VALUE_TYPE_##TYPE_NAME,
37 XRT_FUTURE_VALUE_TYPES(X_ENUM_ENTRY)
38#undef X_ENUM_ENTRY
39
40 // clang-format off
41 XRT_FUTURE_VALUE_TYPE_LIST_END,
42 // clang-format on
43 XRT_FUTURE_VALUE_TYPE_COUNT = XRT_FUTURE_VALUE_TYPE_LIST_END - 1,
44} xrt_future_value_type_t;
47{
48 union {
49#define X_MEMBER_ENTRY(N, TYPE, MEMBER) TYPE MEMBER;
50 XRT_FUTURE_VALUE_TYPES(X_MEMBER_ENTRY)
51#undef X_MEMBER_ENTRY
52 };
53 XRT_ALIGNAS(8) xrt_future_value_type_t type;
54};
55
56static inline bool
57xrt_future_value_is_valid(const struct xrt_future_value *xfv)
58{
59 return xfv && xfv->type != XRT_FUTURE_VALUE_TYPE_NONE;
60}
61
62#define XRT_FUTURE_VALUE_MAKE(TYPE_NAME, MEMBER, VALUE) \
63 XRT_C11_COMPOUND(struct xrt_future_value) \
64 { \
65 .MEMBER = VALUE, .type = XRT_FUTURE_VALUE_TYPE_##TYPE_NAME, \
66 }
67
68#define XRT_NULL_FUTURE_VALUE XRT_FUTURE_VALUE_MAKE(NONE, uint64_, 0)
69
70static inline struct xrt_future_value
71xrt_future_value_make_none(const void *ignore)
72{
73 (void)ignore;
74 return XRT_NULL_FUTURE_VALUE;
75}
76
77#define X_MAKE_CONS_FN(TYPE_NAME, TYPE, MEMBER) \
78 static inline struct xrt_future_value xrt_future_value_make_##MEMBER(TYPE value) \
79 { \
80 return XRT_FUTURE_VALUE_MAKE(TYPE_NAME, MEMBER, value); \
81 } \
82 \
83 static inline struct xrt_future_value xrt_future_value_make_##MEMBER##_ptr(const TYPE *value) \
84 { \
85 assert(value != NULL); \
86 return XRT_FUTURE_VALUE_MAKE(TYPE_NAME, MEMBER, (*value)); \
87 }
88XRT_FUTURE_VALUE_TYPES(X_MAKE_CONS_FN)
89#undef X_MAKE_CONS_FN
90#ifdef __cplusplus
91}
92#endif
93
94#ifdef __cplusplus
95extern "C++" {
96#define X_MAKE_CONS_FN(TYPE_NAME, TYPE, MEMBER) \
97 inline struct xrt_future_value xrt_future_value_make(const TYPE &value) \
98 { \
99 return XRT_FUTURE_VALUE_MAKE(TYPE_NAME, MEMBER, value); \
100 }
101XRT_FUTURE_VALUE_TYPES(X_MAKE_CONS_FN)
102#undef X_MAKE_CONS_FN
103}
104#else
105// clang-format off
106#define XRT_FUTURE_VALUE_TYPECASE(TYPE_NAME, TYPE, MEMBER, P) \
107 TYPE: xrt_future_value_make_##MEMBER, \
108 const TYPE*: xrt_future_value_make_##MEMBER##_ptr,
109
110#define xrt_future_value_make(VALUE) \
111 _Generic((VALUE), \
112 XRT_FUTURE_VALUE_TYPES_WITH(XRT_FUTURE_VALUE_TYPECASE, _) \
113 default: xrt_future_value_make_none \
114 )(VALUE)
115// clang-format on
116#endif
Definition: xrt_future_value.h:46
Header holding common defines.
Common defines and enums for XRT.