The open source OpenXR runtime
1// Copyright 2022, Collabora, Ltd.
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Expose std::deque to C
6 * @author Mateo de Mayo <mateo.demayo@collabora.com>
7 * @ingroup aux_util
8 */
9
10#include "u_deque.h"
11#include "util/u_time.h"
12#include <deque>
13
14using std::deque;
15
16#define U_DEQUE_IMPLEMENTATION(TYPE) \
17 u_deque_##TYPE u_deque_##TYPE##_create() \
18 { \
19 u_deque_##TYPE ud{new deque<TYPE>}; \
20 return ud; \
21 } \
22 \
23 void u_deque_##TYPE##_push_back(u_deque_##TYPE ud, TYPE e) \
24 { \
25 deque<TYPE> *d = static_cast<deque<TYPE> *>(ud.ptr); \
26 d->push_back(e); \
27 } \
28 \
29 bool u_deque_##TYPE##_pop_front(u_deque_##TYPE ud, TYPE *e) \
30 { \
31 deque<TYPE> *d = static_cast<deque<TYPE> *>(ud.ptr); \
32 bool pop = !d->empty(); \
33 if (pop) { \
34 *e = d->front(); \
35 d->erase(d->begin()); \
36 } \
37 return pop; \
38 } \
39 \
40 TYPE u_deque_##TYPE##_at(u_deque_##TYPE ud, size_t i) \
41 { \
42 deque<TYPE> *d = static_cast<deque<TYPE> *>(ud.ptr); \
43 return d->at(i); \
44 } \
45 \
46 size_t u_deque_##TYPE##_size(u_deque_##TYPE ud) \
47 { \
48 deque<TYPE> *d = static_cast<deque<TYPE> *>(ud.ptr); \
49 return d->size(); \
50 } \
51 \
52 void u_deque_##TYPE##_destroy(u_deque_##TYPE *ud) \
53 { \
54 deque<TYPE> *d = static_cast<deque<TYPE> *>(ud->ptr); \
55 delete d; \
56 ud->ptr = nullptr; \
57 }
58
59extern "C" {
60U_DEQUE_IMPLEMENTATION(timepoint_ns)
61}