The open source OpenXR runtime

u/deque: Add generic wrapper for std::deque

authored by

Mateo de Mayo and committed by
Moses Turner
ae8305f3 a7e62432

+158
+2
src/xrt/auxiliary/util/CMakeLists.txt
··· 17 17 u_builders.h 18 18 u_debug.c 19 19 u_debug.h 20 + u_deque.cpp 21 + u_deque.h 20 22 u_device.c 21 23 u_device.h 22 24 u_distortion.c
+61
src/xrt/auxiliary/util/u_deque.cpp
··· 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 + 14 + using 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 + 59 + extern "C" { 60 + U_DEQUE_IMPLEMENTATION(timepoint_ns) 61 + }
+35
src/xrt/auxiliary/util/u_deque.h
··· 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 + #pragma once 11 + 12 + #include "util/u_time.h" 13 + #include <stddef.h> 14 + 15 + #ifdef __cplusplus 16 + extern "C" { 17 + #endif 18 + 19 + #define U_DEQUE_DECLARATION(TYPE) \ 20 + struct u_deque_##TYPE \ 21 + { \ 22 + void *ptr; \ 23 + }; \ 24 + struct u_deque_##TYPE u_deque_##TYPE##_create(); \ 25 + void u_deque_##TYPE##_push_back(struct u_deque_##TYPE ud, TYPE e); \ 26 + bool u_deque_##TYPE##_pop_front(struct u_deque_##TYPE ud, TYPE *e); \ 27 + TYPE u_deque_##TYPE##_at(struct u_deque_##TYPE ud, size_t i); \ 28 + size_t u_deque_##TYPE##_size(struct u_deque_##TYPE wrap); \ 29 + void u_deque_##TYPE##_destroy(struct u_deque_##TYPE *ud); 30 + 31 + U_DEQUE_DECLARATION(timepoint_ns) 32 + 33 + #ifdef __cplusplus 34 + } 35 + #endif
+1
tests/CMakeLists.txt
··· 11 11 12 12 set(tests 13 13 tests_cxx_wrappers 14 + tests_deque 14 15 tests_generic_callbacks 15 16 tests_history_buf 16 17 tests_id_ringbuffer
+59
tests/tests_deque.cpp
··· 1 + // Copyright 2022, Collabora, Ltd. 2 + // SPDX-License-Identifier: BSL-1.0 3 + /*! 4 + * @file 5 + * @brief Test u_deque C interface. 6 + * @author Mateo de Mayo <mateo.demayo@collabora.com> 7 + */ 8 + 9 + #include "catch/catch.hpp" 10 + #include "util/u_deque.h" 11 + 12 + TEST_CASE("u_deque") 13 + { 14 + SECTION("Test interface generated from macros") 15 + { 16 + struct u_deque_timepoint_ns dt = u_deque_timepoint_ns_create(); 17 + CHECK(dt.ptr != NULL); 18 + 19 + constexpr timepoint_ns A = 11111111; 20 + constexpr timepoint_ns B = 22222222; 21 + constexpr timepoint_ns C = 33333333; 22 + timepoint_ns elem = 0; 23 + 24 + CHECK(!u_deque_timepoint_ns_pop_front(dt, &elem)); 25 + CHECK(elem == 0); 26 + 27 + u_deque_timepoint_ns_push_back(dt, C); 28 + u_deque_timepoint_ns_push_back(dt, A); 29 + 30 + CHECK(u_deque_timepoint_ns_pop_front(dt, &elem)); 31 + CHECK(elem == C); 32 + CHECK(u_deque_timepoint_ns_size(dt) == 1); 33 + 34 + u_deque_timepoint_ns_push_back(dt, B); 35 + u_deque_timepoint_ns_push_back(dt, C); 36 + 37 + timepoint_ns a = u_deque_timepoint_ns_at(dt, 0); 38 + timepoint_ns b = u_deque_timepoint_ns_at(dt, 1); 39 + timepoint_ns c = u_deque_timepoint_ns_at(dt, 2); 40 + 41 + CHECK(a == A); 42 + CHECK(b == B); 43 + CHECK(c == C); 44 + 45 + CHECK(u_deque_timepoint_ns_size(dt) == 3); 46 + 47 + CHECK(u_deque_timepoint_ns_pop_front(dt, &elem)); 48 + CHECK(elem == A); 49 + CHECK(u_deque_timepoint_ns_pop_front(dt, &elem)); 50 + CHECK(elem == B); 51 + CHECK(u_deque_timepoint_ns_pop_front(dt, &elem)); 52 + CHECK(elem == C); 53 + 54 + CHECK(u_deque_timepoint_ns_size(dt) == 0); 55 + 56 + u_deque_timepoint_ns_destroy(&dt); 57 + CHECK(dt.ptr == NULL); 58 + } 59 + }