diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 522f0793..efb6a28b 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -18,12 +18,14 @@ jobs: fail-fast: false matrix: sys: - - {compiler: clang, version: '16', config-flags: '', stdlib: 'libstdc++-12' } - # - {compiler: clang, version: '16', config-flags: '-DCMAKE_CXX_FLAGS=-stdlib=libc++', stdlib: 'libc++-17' } - - {compiler: clang, version: '17', config-flags: '', stdlib: 'libstdc++-12' } - # - {compiler: clang, version: '17', config-flags: '-DCMAKE_CXX_FLAGS=-stdlib=libc++', stdlib: 'libc++-17' } - - {compiler: gcc, version: '12', config-flags: '' } - - {compiler: gcc, version: '13', config-flags: '' } + - {compiler: clang, version: '16', config-flags: '', stdlib: 'libstdc++-12', date-polyfill: 'ON' } + # - {compiler: clang, version: '16', config-flags: '-DCMAKE_CXX_FLAGS=-stdlib=libc++', stdlib: 'libc++-17', date-polyfill: 'ON' } + - {compiler: clang, version: '17', config-flags: '', stdlib: 'libstdc++-12', date-polyfill: 'ON' } + # - {compiler: clang, version: '17', config-flags: '-DCMAKE_CXX_FLAGS=-stdlib=libc++', stdlib: 'libc++-17', date-polyfill: 'ON' } + + - {compiler: gcc, version: '12', config-flags: '', date-polyfill: 'ON' } + - {compiler: gcc, version: '13', config-flags: '', date-polyfill: 'ON' } + - {compiler: gcc, version: '13', config-flags: '', date-polyfill: 'OFF' } config: - { name: Debug } @@ -61,7 +63,7 @@ jobs: cache-downloads: true - name: Configure using CMake - run: cmake -G Ninja -Bbuild ${{matrix.sys.config-flags}} -DCMAKE_BUILD_TYPE:STRING=${{matrix.config.name}} -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DBUILD_TESTS=ON + run: cmake -G Ninja -Bbuild ${{matrix.sys.config-flags}} -DCMAKE_BUILD_TYPE:STRING=${{matrix.config.name}} -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DUSE_DATE_POLYFILL=${{matrix.sys.date-polyfill}} -DBUILD_TESTS=ON - name: Install working-directory: build diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 125af345..208deca9 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -13,15 +13,16 @@ defaults: jobs: build: runs-on: ${{ matrix.runs-on }} - name: ${{ matrix.sys.compiler }}-${{ matrix.build-system }}-${{ matrix.config.name }} + name: ${{ matrix.sys.compiler }}-${{ matrix.build-system }}-${{ matrix.config.name }}-date-polyfill-${{ matrix.sys.date-polyfill}} strategy: fail-fast: false matrix: runs-on: [windows-latest] sys: - - {compiler: default} - - {compiler: msvc} - - {compiler: clang} + - {compiler: msvc, date-polyfill: 'ON' } + - {compiler: msvc, date-polyfill: 'OFF' } + - {compiler: clang, date-polyfill: 'ON' } + - {compiler: clang, date-polyfill: 'OFF' } config: - { name: Debug } - { name: Release } @@ -55,7 +56,7 @@ jobs: ninja - name: Configure using CMake - run: cmake -Bbuild -DCMAKE_BUILD_TYPE:STRING=${{matrix.config.name}} -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DBUILD_TESTS=ON -G "${{matrix.build-system}}" + run: cmake -Bbuild -DCMAKE_BUILD_TYPE:STRING=${{matrix.config.name}} -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DBUILD_TESTS=ON -DUSE_DATE_POLYFILL=${{matrix.sys.date-polyfill}} -G "${{matrix.build-system}}" - name: Install working-directory: build diff --git a/CMakeLists.txt b/CMakeLists.txt index d38c433e..b8e93aee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,8 @@ message(STATUS "Building sparrow v${${PROJECT_NAME}_VERSION}") # Build options # ============= -OPTION(BUILD_TESTS "sparrow test suite" OFF) +OPTION(BUILD_TESTS "Build sparrow test suite" OFF) +OPTION(USE_DATE_POLYFILL "Use date polyfill implementation" ON) include(CheckCXXSymbolExists) @@ -73,8 +74,11 @@ endif() set(SPARROW_INTERFACE_DEPENDENCIES "" CACHE STRING "List of dependencies to be linked to the sparrow target") -find_package(date CONFIG REQUIRED) -list(APPEND SPARROW_INTERFACE_DEPENDENCIES date::date date::date-tz) +if (USE_DATE_POLYFILL) + find_package(date CONFIG REQUIRED) + list(APPEND SPARROW_INTERFACE_DEPENDENCIES date::date date::date-tz) + add_compile_definitions(SPARROW_USE_DATE_POLYFILL) +endif() # Build # ===== diff --git a/include/sparrow/buffer.hpp b/include/sparrow/buffer.hpp index 49f598cb..007fca0e 100644 --- a/include/sparrow/buffer.hpp +++ b/include/sparrow/buffer.hpp @@ -722,7 +722,7 @@ namespace sparrow { if (new_size > size()) { - const size_t nb_init = new_size - size(); + const std::size_t nb_init = new_size - size(); if (new_size <= capacity()) { initializer(nb_init); diff --git a/include/sparrow/data_type.hpp b/include/sparrow/data_type.hpp index c1b4cab6..dc031fe4 100644 --- a/include/sparrow/data_type.hpp +++ b/include/sparrow/data_type.hpp @@ -17,11 +17,11 @@ #include #include -// P0355R7 (Extending chrono to Calendars and Time Zones) has not been entirely implemented in libc++ yet. -// See: https://libcxx.llvm.org/Status/Cxx20.html#note-p0355 -// For now, we use HowardHinnant/date as a replacement if we are compiling with libc++. -// TODO: remove this once libc++ has full support for P0355R7. +#if defined(SPARROW_USE_DATE_POLYFILL) #include +#else +namespace date = std::chrono; +#endif #include #include diff --git a/test/array_data_creation.cpp b/test/array_data_creation.cpp index 8a66109c..ed073c20 100644 --- a/test/array_data_creation.cpp +++ b/test/array_data_creation.cpp @@ -1,38 +1,46 @@ #include "array_data_creation.hpp" +#include +#include +#include + +#if defined(SPARROW_USE_DATE_POLYFILL) #include #include +#else +namespace date = std::chrono; +#endif namespace sparrow::test { using sys_time = std::chrono::time_point; - using namespace date::literals; - template <> sparrow::array_data - make_test_array_data(size_t n, size_t offset, const std::vector& false_bitmap) + make_test_array_data(std::size_t n, std::size_t offset, const std::vector& false_bitmap) { sparrow::array_data ad; ad.type = sparrow::data_descriptor(sparrow::arrow_traits::type_id); ad.bitmap = sparrow::dynamic_bitset(n, true); - for (const auto i : false_bitmap) { - if (i >= n) { + for (const auto i : false_bitmap) + { + if (i >= n) + { throw std::invalid_argument("Index out of range"); } ad.bitmap.set(i, false); } - const size_t buffer_size = (n * sizeof(sparrow::timestamp)) / sizeof(uint8_t); + const std::size_t buffer_size = (n * sizeof(sparrow::timestamp)) / sizeof(uint8_t); sparrow::buffer b(buffer_size); for (uint8_t i = 0; i < n; ++i) { - b.data()[i] = sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(i)); + b.data()[i] = sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(i)); } ad.buffers.push_back(b); - ad.length = n; - ad.offset = offset; + ad.length = static_cast(n); + ad.offset = static_cast(offset); ad.child_data.emplace_back(); return ad; } diff --git a/test/test_typed_array_timestamp.cpp b/test/test_typed_array_timestamp.cpp index 3cd52f65..7496d8d2 100644 --- a/test/test_typed_array_timestamp.cpp +++ b/test/test_typed_array_timestamp.cpp @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include #include #include #include @@ -20,110 +21,110 @@ #include #include +#if defined(SPARROW_USE_DATE_POLYFILL) +#include +#else +namespace date = std::chrono; +#endif + #include "sparrow/typed_array.hpp" #include "sparrow/data_type.hpp" #include "array_data_creation.hpp" #include "doctest/doctest.h" -using namespace sparrow; - namespace { - constexpr size_t n = 10; - constexpr size_t offset = 1; + constexpr std::size_t test_n = 10; + constexpr std::size_t test_offset = 1; const std::vector false_bitmap = {9}; using sys_time = std::chrono::time_point; - - using namespace date::literals; } TEST_SUITE("typed_array_timestamp") { TEST_CASE("constructor with parameter") { - constexpr size_t n = 10; - constexpr size_t offset = 1; - const auto array_data = sparrow::test::make_test_array_data(n, offset); - const typed_array ta{array_data}; - CHECK_EQ(ta.size(), n - offset); + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset); + const sparrow::typed_array ta{array_data}; + CHECK_EQ(ta.size(), test_n - test_offset); } // Element access TEST_CASE("at") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - typed_array ta{array_data}; - for (typename typed_array::size_type i = 0; i < ta.size() - 1; ++i) + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + sparrow::typed_array ta{array_data}; + for (typename sparrow::typed_array::size_type i = 0; i < ta.size() - 1; ++i) { - CHECK_EQ(ta.at(i).value(), sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(i + 1))); + CHECK_EQ(ta.at(i).value(), sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(i + 1))); } - CHECK_FALSE(ta.at(false_bitmap[0] - offset).has_value()); + CHECK_FALSE(ta.at(false_bitmap[0] - test_offset).has_value()); CHECK_THROWS_AS(ta.at(ta.size()), std::out_of_range); } TEST_CASE("const at") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; - for (typename typed_array::size_type i = 0; i < ta.size() - 1; ++i) + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; + for (typename sparrow::typed_array::size_type i = 0; i < ta.size() - 1; ++i) { - CHECK_EQ(ta.at(i).value(), sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(i + 1))); + CHECK_EQ(ta.at(i).value(), sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(i + 1))); } - CHECK_FALSE(ta.at(false_bitmap[0] - offset).has_value()); + CHECK_FALSE(ta.at(false_bitmap[0] - test_offset).has_value()); CHECK_THROWS_AS(ta.at(ta.size()), std::out_of_range); } TEST_CASE("operator[]") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - typed_array ta{array_data}; - for (typename typed_array::size_type i = 0; i < ta.size() - 1; ++i) + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + sparrow::typed_array ta{array_data}; + for (typename sparrow::typed_array::size_type i = 0; i < ta.size() - 1; ++i) { - CHECK_EQ(ta[i].value(), sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(i + 1))); + CHECK_EQ(ta[i].value(), sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(i + 1))); } CHECK_FALSE(ta[ta.size() - 1].has_value()); } TEST_CASE("const operator[]") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; - for (typename typed_array::size_type i = 0; i < ta.size() - 1; ++i) + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; + for (typename sparrow::typed_array::size_type i = 0; i < ta.size() - 1; ++i) { - CHECK_EQ(ta[i].value(), sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(i + 1))); + CHECK_EQ(ta[i].value(), sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(i + 1))); } - CHECK_FALSE(ta[false_bitmap[0] - offset].has_value()); + CHECK_FALSE(ta[false_bitmap[0] - test_offset].has_value()); } TEST_CASE("front") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - typed_array ta{array_data}; - CHECK_EQ(ta.front().value(), sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(1))); + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + sparrow::typed_array ta{array_data}; + CHECK_EQ(ta.front().value(), sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(1))); } TEST_CASE("const front") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; - CHECK_EQ(ta.front().value(), sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(1))); + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; + CHECK_EQ(ta.front().value(), sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(1))); } TEST_CASE("back") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - typed_array ta{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + sparrow::typed_array ta{array_data}; CHECK_FALSE(ta.back().has_value()); } TEST_CASE("const back") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; CHECK_FALSE(ta.back().has_value()); } @@ -131,8 +132,8 @@ TEST_SUITE("typed_array_timestamp") TEST_CASE("const iterators") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; auto iter = ta.cbegin(); CHECK(std::is_const_vvalue())>>); @@ -146,7 +147,7 @@ TEST_SUITE("typed_array_timestamp") CHECK(std::is_const_vvalue())>>); CHECK_EQ(end, end_bis); - for (typename typed_array::size_type i = 0; i < ta.size() - 1; ++iter, ++i) + for (typename sparrow::typed_array::size_type i = 0; i < ta.size() - 1; ++iter, ++i) { REQUIRE(iter->has_value()); CHECK_EQ(*iter, std::make_optional(ta[i].value())); @@ -155,32 +156,32 @@ TEST_SUITE("typed_array_timestamp") CHECK_EQ(++iter, end); const auto array_data_empty = sparrow::test::make_test_array_data(0, 0); - const typed_array typed_array_empty(array_data_empty); + const sparrow::typed_array typed_array_empty(array_data_empty); CHECK_EQ(typed_array_empty.cbegin(), typed_array_empty.cend()); } TEST_CASE("bitmap") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; const auto bitmap = ta.bitmap(); - REQUIRE_EQ(bitmap.size(), n - offset); - for (size_t i = 0; i < bitmap.size() - 1; ++i) + REQUIRE_EQ(bitmap.size(), test_n - test_offset); + for (std::size_t i = 0; i < bitmap.size() - 1; ++i) { - CHECK(bitmap[i]); + CHECK(bitmap[static_cast(i)]); } CHECK_FALSE(bitmap[8]); } TEST_CASE("values") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; const auto values = ta.values(); - CHECK_EQ(values.size(), n - offset); - for (typename typed_array::size_type i = 0; i < values.size(); ++i) + CHECK_EQ(values.size(), test_n - test_offset); + for (typename sparrow::typed_array::size_type i = 0; i < values.size(); ++i) { - CHECK_EQ(values[i], sparrow::timestamp(date::sys_days(1970_y/date::January/1_d) + date::days(i + 1))); + CHECK_EQ(values[static_cast(i)], sparrow::timestamp(date::sys_days(date::year(1970)/date::January/date::day(1)) + date::days(i + 1))); } } @@ -188,48 +189,48 @@ TEST_SUITE("typed_array_timestamp") TEST_CASE("empty") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; CHECK_FALSE(ta.empty()); const auto array_data_empty = sparrow::test::make_test_array_data(0, 0); - const typed_array typed_array_empty(array_data_empty); + const sparrow::typed_array typed_array_empty(array_data_empty); CHECK(typed_array_empty.empty()); } TEST_CASE("size") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; - CHECK_EQ(ta.size(), n - offset); + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; + CHECK_EQ(ta.size(), test_n - test_offset); } // Operators TEST_CASE("==") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; - const typed_array ta_same{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; + const sparrow::typed_array ta_same{array_data}; CHECK(ta == ta); CHECK(ta == ta_same); - const auto array_data_less = sparrow::test::make_test_array_data(n - 1, offset - 1, {8}); - const ::typed_array ta_less{array_data_less}; + const auto array_data_less = sparrow::test::make_test_array_data(test_n - 1, test_offset - 1, {8}); + const sparrow::typed_array ta_less{array_data_less}; CHECK_FALSE(ta == ta_less); CHECK_FALSE(ta_less == ta); } TEST_CASE("!=") { - const auto array_data = sparrow::test::make_test_array_data(n, offset, false_bitmap); - const typed_array ta{array_data}; - const typed_array ta_same{array_data}; + const auto array_data = sparrow::test::make_test_array_data(test_n, test_offset, false_bitmap); + const sparrow::typed_array ta{array_data}; + const sparrow::typed_array ta_same{array_data}; CHECK_FALSE(ta != ta); CHECK_FALSE(ta != ta_same); - const auto array_data_less = sparrow::test::make_test_array_data(n - 1, offset - 1, {8}); - const typed_array ta_less{array_data_less}; + const auto array_data_less = sparrow::test::make_test_array_data(test_n - 1, test_offset - 1, {8}); + const sparrow::typed_array ta_less{array_data_less}; CHECK(ta != ta_less); CHECK(ta_less != ta); }