From fba15b1a72403c95aae2ef420bdb13f9601b500e Mon Sep 17 00:00:00 2001 From: Ferdinand Bachmann Date: Sat, 18 Apr 2020 14:15:25 +0200 Subject: [PATCH] add constexpr-array-shim to test constexpr on C++14 --- test/CMakeLists.txt | 3 +- test/constexpr-array-shim.h | 56 +++++++++++++++++++++++++++ test/push-iterate-const-constexpr.cpp | 20 +++++----- test/push-iterate-constexpr.cpp | 18 +++++---- 4 files changed, 79 insertions(+), 18 deletions(-) create mode 100644 test/constexpr-array-shim.h diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 1f1dd51..b63f192 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,6 +7,7 @@ foreach(test-source ${test-sources}) list(APPEND test-targets ${test-target}) add_executable(${test-target} ${test-source}) + target_include_directories(${test-target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(${test-target} PRIVATE ring-buffer) endforeach() @@ -27,7 +28,7 @@ foreach(test-directory ${test-directories}) endif() add_executable(${test-target} ${test-directory-sources}) if(IS_DIRECTORY ${test-directory}/include) - target_include_directories(${test-target} PRIVATE ${test-directory}/include) + target_include_directories(${test-target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${test-directory}/include) endif() target_link_libraries(${test-target} PRIVATE ring-buffer) endforeach() diff --git a/test/constexpr-array-shim.h b/test/constexpr-array-shim.h new file mode 100644 index 0000000..5235080 --- /dev/null +++ b/test/constexpr-array-shim.h @@ -0,0 +1,56 @@ +#ifndef _CONSTEXPR_ARRAY_SHIM_H +#define _CONSTEXPR_ARRAY_SHIM_H + +#include + +#if defined( __cpp_lib_array_constexpr) && __cpp_lib_array_constexpr >= 201606L +template +using constexpr_array = array; +#else +template +struct constexpr_array { + using size_type = size_t; + using value_type = T; + + T data[N]; + + constexpr size_t size() const { + return N; + } + + constexpr T* begin() { + return data; + } + + constexpr T* end() { + return &data[N]; + } + + constexpr const T* begin() const { + return data; + } + + constexpr const T* end() const { + return &data[N]; + } + + constexpr const T* cbegin() const { + return data; + } + + constexpr const T* cend() const { + return &data[N]; + } + + constexpr T& operator[](size_t index) { + return data[index]; + } + + constexpr const T& operator[](size_t index) const { + return data[index]; + } +}; + +#endif + +#endif diff --git a/test/push-iterate-const-constexpr.cpp b/test/push-iterate-const-constexpr.cpp index 93080ac..8d5fc97 100644 --- a/test/push-iterate-const-constexpr.cpp +++ b/test/push-iterate-const-constexpr.cpp @@ -2,8 +2,10 @@ #include #ifdef RING_BUFFER_CONSTEXPR +#include "constexpr-array-shim.h" + template -constexpr bool array_equal(const std::array& a, const std::array& b) { +constexpr bool array_equal(const constexpr_array& a, const constexpr_array& b) { for (size_t i = 0; i < N; i++) { if (a[i] != b[i]) return false; } @@ -12,9 +14,9 @@ constexpr bool array_equal(const std::array& a, const std::array& b) } constexpr bool test() { - std::array init{0, 0, 0, 0}; - ring_buffer buf(init); - const ring_buffer& const_buf = buf; + constexpr_array init{0, 0, 0, 0}; + basic_ring_buffer> buf(init); + const basic_ring_buffer>& const_buf = buf; buf.push_back(1); buf.push_back(2); @@ -24,8 +26,8 @@ constexpr bool test() { buf.push_back(6); { - std::array expected{3, 4, 5, 6}; - std::array actual{0, 0, 0, 0}; + constexpr_array expected{3, 4, 5, 6}; + constexpr_array actual{0, 0, 0, 0}; int actual_index = 0; for (const int& i : const_buf) { actual[actual_index++] = i; @@ -36,8 +38,8 @@ constexpr bool test() { buf.push_back(7); { - std::array expected{4, 5, 6, 7}; - std::array actual{0, 0, 0, 0}; + constexpr_array expected{4, 5, 6, 7}; + constexpr_array actual{0, 0, 0, 0}; int actual_index = 0; for (const int& i : const_buf) { actual[actual_index++] = i; @@ -48,7 +50,7 @@ constexpr bool test() { return true; } -static_assert(test()); +static_assert(test(), ""); #endif int main() {} diff --git a/test/push-iterate-constexpr.cpp b/test/push-iterate-constexpr.cpp index 226bf5a..8cee57a 100644 --- a/test/push-iterate-constexpr.cpp +++ b/test/push-iterate-constexpr.cpp @@ -2,8 +2,10 @@ #include #ifdef RING_BUFFER_CONSTEXPR +#include "constexpr-array-shim.h" + template -constexpr bool array_equal(const std::array& a, const std::array& b) { +constexpr bool array_equal(const constexpr_array& a, const constexpr_array& b) { for (size_t i = 0; i < N; i++) { if (a[i] != b[i]) return false; } @@ -12,8 +14,8 @@ constexpr bool array_equal(const std::array& a, const std::array& b) } constexpr bool test() { - std::array init{0, 0, 0, 0}; - ring_buffer buf(init); + constexpr_array init{0, 0, 0, 0}; + basic_ring_buffer> buf(init); buf.push_back(1); buf.push_back(2); @@ -23,8 +25,8 @@ constexpr bool test() { buf.push_back(6); { - std::array expected{13, 14, 15, 16}; - std::array actual{0, 0, 0, 0}; + constexpr_array expected{13, 14, 15, 16}; + constexpr_array actual{0, 0, 0, 0}; int actual_index = 0; for (int& i : buf) { i += 10; @@ -36,8 +38,8 @@ constexpr bool test() { buf.push_back(7); { - std::array expected{24, 25, 26, 17}; - std::array actual{0, 0, 0, 0}; + constexpr_array expected{24, 25, 26, 17}; + constexpr_array actual{0, 0, 0, 0}; int actual_index = 0; for (int& i : buf) { i += 10; @@ -49,7 +51,7 @@ constexpr bool test() { return true; } -static_assert(test()); +static_assert(test(), ""); #endif int main() {}