forked from Ferdi265/cxx-ring-buffer
add constexpr-array-shim to test constexpr on C++14
This commit is contained in:
@ -7,6 +7,7 @@ foreach(test-source ${test-sources})
|
|||||||
list(APPEND test-targets ${test-target})
|
list(APPEND test-targets ${test-target})
|
||||||
|
|
||||||
add_executable(${test-target} ${test-source})
|
add_executable(${test-target} ${test-source})
|
||||||
|
target_include_directories(${test-target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
target_link_libraries(${test-target} PRIVATE ring-buffer)
|
target_link_libraries(${test-target} PRIVATE ring-buffer)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
@ -27,7 +28,7 @@ foreach(test-directory ${test-directories})
|
|||||||
endif()
|
endif()
|
||||||
add_executable(${test-target} ${test-directory-sources})
|
add_executable(${test-target} ${test-directory-sources})
|
||||||
if(IS_DIRECTORY ${test-directory}/include)
|
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()
|
endif()
|
||||||
target_link_libraries(${test-target} PRIVATE ring-buffer)
|
target_link_libraries(${test-target} PRIVATE ring-buffer)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
56
test/constexpr-array-shim.h
Normal file
56
test/constexpr-array-shim.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#ifndef _CONSTEXPR_ARRAY_SHIM_H
|
||||||
|
#define _CONSTEXPR_ARRAY_SHIM_H
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
#if defined( __cpp_lib_array_constexpr) && __cpp_lib_array_constexpr >= 201606L
|
||||||
|
template <typename T, size_t N>
|
||||||
|
using constexpr_array = array;
|
||||||
|
#else
|
||||||
|
template <typename T, size_t N>
|
||||||
|
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
|
@ -2,8 +2,10 @@
|
|||||||
#include <ring-buffer.h>
|
#include <ring-buffer.h>
|
||||||
|
|
||||||
#ifdef RING_BUFFER_CONSTEXPR
|
#ifdef RING_BUFFER_CONSTEXPR
|
||||||
|
#include "constexpr-array-shim.h"
|
||||||
|
|
||||||
template <typename T, size_t N>
|
template <typename T, size_t N>
|
||||||
constexpr bool array_equal(const std::array<T, N>& a, const std::array<T, N>& b) {
|
constexpr bool array_equal(const constexpr_array<T, N>& a, const constexpr_array<T, N>& b) {
|
||||||
for (size_t i = 0; i < N; i++) {
|
for (size_t i = 0; i < N; i++) {
|
||||||
if (a[i] != b[i]) return false;
|
if (a[i] != b[i]) return false;
|
||||||
}
|
}
|
||||||
@ -12,9 +14,9 @@ constexpr bool array_equal(const std::array<T, N>& a, const std::array<T, N>& b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool test() {
|
constexpr bool test() {
|
||||||
std::array<int, 4> init{0, 0, 0, 0};
|
constexpr_array<int, 4> init{0, 0, 0, 0};
|
||||||
ring_buffer<int, 4> buf(init);
|
basic_ring_buffer<constexpr_array<int, 4>> buf(init);
|
||||||
const ring_buffer<int, 4>& const_buf = buf;
|
const basic_ring_buffer<constexpr_array<int, 4>>& const_buf = buf;
|
||||||
|
|
||||||
buf.push_back(1);
|
buf.push_back(1);
|
||||||
buf.push_back(2);
|
buf.push_back(2);
|
||||||
@ -24,8 +26,8 @@ constexpr bool test() {
|
|||||||
buf.push_back(6);
|
buf.push_back(6);
|
||||||
|
|
||||||
{
|
{
|
||||||
std::array<int, 4> expected{3, 4, 5, 6};
|
constexpr_array<int, 4> expected{3, 4, 5, 6};
|
||||||
std::array<int, 4> actual{0, 0, 0, 0};
|
constexpr_array<int, 4> actual{0, 0, 0, 0};
|
||||||
int actual_index = 0;
|
int actual_index = 0;
|
||||||
for (const int& i : const_buf) {
|
for (const int& i : const_buf) {
|
||||||
actual[actual_index++] = i;
|
actual[actual_index++] = i;
|
||||||
@ -36,8 +38,8 @@ constexpr bool test() {
|
|||||||
buf.push_back(7);
|
buf.push_back(7);
|
||||||
|
|
||||||
{
|
{
|
||||||
std::array<int, 4> expected{4, 5, 6, 7};
|
constexpr_array<int, 4> expected{4, 5, 6, 7};
|
||||||
std::array<int, 4> actual{0, 0, 0, 0};
|
constexpr_array<int, 4> actual{0, 0, 0, 0};
|
||||||
int actual_index = 0;
|
int actual_index = 0;
|
||||||
for (const int& i : const_buf) {
|
for (const int& i : const_buf) {
|
||||||
actual[actual_index++] = i;
|
actual[actual_index++] = i;
|
||||||
@ -48,7 +50,7 @@ constexpr bool test() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static_assert(test());
|
static_assert(test(), "");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main() {}
|
int main() {}
|
||||||
|
@ -2,8 +2,10 @@
|
|||||||
#include <ring-buffer.h>
|
#include <ring-buffer.h>
|
||||||
|
|
||||||
#ifdef RING_BUFFER_CONSTEXPR
|
#ifdef RING_BUFFER_CONSTEXPR
|
||||||
|
#include "constexpr-array-shim.h"
|
||||||
|
|
||||||
template <typename T, size_t N>
|
template <typename T, size_t N>
|
||||||
constexpr bool array_equal(const std::array<T, N>& a, const std::array<T, N>& b) {
|
constexpr bool array_equal(const constexpr_array<T, N>& a, const constexpr_array<T, N>& b) {
|
||||||
for (size_t i = 0; i < N; i++) {
|
for (size_t i = 0; i < N; i++) {
|
||||||
if (a[i] != b[i]) return false;
|
if (a[i] != b[i]) return false;
|
||||||
}
|
}
|
||||||
@ -12,8 +14,8 @@ constexpr bool array_equal(const std::array<T, N>& a, const std::array<T, N>& b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr bool test() {
|
constexpr bool test() {
|
||||||
std::array<int, 4> init{0, 0, 0, 0};
|
constexpr_array<int, 4> init{0, 0, 0, 0};
|
||||||
ring_buffer<int, 4> buf(init);
|
basic_ring_buffer<constexpr_array<int, 4>> buf(init);
|
||||||
|
|
||||||
buf.push_back(1);
|
buf.push_back(1);
|
||||||
buf.push_back(2);
|
buf.push_back(2);
|
||||||
@ -23,8 +25,8 @@ constexpr bool test() {
|
|||||||
buf.push_back(6);
|
buf.push_back(6);
|
||||||
|
|
||||||
{
|
{
|
||||||
std::array<int, 4> expected{13, 14, 15, 16};
|
constexpr_array<int, 4> expected{13, 14, 15, 16};
|
||||||
std::array<int, 4> actual{0, 0, 0, 0};
|
constexpr_array<int, 4> actual{0, 0, 0, 0};
|
||||||
int actual_index = 0;
|
int actual_index = 0;
|
||||||
for (int& i : buf) {
|
for (int& i : buf) {
|
||||||
i += 10;
|
i += 10;
|
||||||
@ -36,8 +38,8 @@ constexpr bool test() {
|
|||||||
buf.push_back(7);
|
buf.push_back(7);
|
||||||
|
|
||||||
{
|
{
|
||||||
std::array<int, 4> expected{24, 25, 26, 17};
|
constexpr_array<int, 4> expected{24, 25, 26, 17};
|
||||||
std::array<int, 4> actual{0, 0, 0, 0};
|
constexpr_array<int, 4> actual{0, 0, 0, 0};
|
||||||
int actual_index = 0;
|
int actual_index = 0;
|
||||||
for (int& i : buf) {
|
for (int& i : buf) {
|
||||||
i += 10;
|
i += 10;
|
||||||
@ -49,7 +51,7 @@ constexpr bool test() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static_assert(test());
|
static_assert(test(), "");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main() {}
|
int main() {}
|
||||||
|
Reference in New Issue
Block a user