diff --git a/.github/workflows/c26-build-container.yml b/.github/workflows/c26-build-container.yml new file mode 100644 index 0000000..c250ad1 --- /dev/null +++ b/.github/workflows/c26-build-container.yml @@ -0,0 +1,28 @@ +name: C++26 Build and Test + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build Docker image + run: | + docker build -t cpp26-app . + + - name: Run tests in Docker container + run: | + docker run --rm cpp26-app /bin/bash -c "cd /workspace && cmake -B build" \ No newline at end of file diff --git a/benchmarks/simpleparser/from_json.hpp b/benchmarks/simpleparser/from_json.hpp index 1a8fdb5..a5e6e6d 100644 --- a/benchmarks/simpleparser/from_json.hpp +++ b/benchmarks/simpleparser/from_json.hpp @@ -45,7 +45,7 @@ void from_json(const JsonValue& j, T& obj) requires(simdjson::json_builder::User } // Using reflection to iterate over data members - [:simdjson::json_builder::expand(std::meta::nonstatic_data_members_of(^T)):] >> [&]<auto dm> { + [:simdjson::json_builder::expand(std::meta::nonstatic_data_members_of(^^T)):] >> [&]<auto dm> { constexpr auto name = std::meta::identifier_of(dm); auto it = j.object_value.find(std::string(reinterpret_cast<const char*>(name.data()), name.size())); if (it != j.object_value.end()) { diff --git a/include/simdjson/json_builder/json_builder.h b/include/simdjson/json_builder/json_builder.h index 4f6a435..cfb87ed 100644 --- a/include/simdjson/json_builder/json_builder.h +++ b/include/simdjson/json_builder/json_builder.h @@ -48,7 +48,7 @@ template <typename R> consteval auto expand(R range) { for (auto r : range) { args.push_back(std::meta::reflect_value(r)); } - return substitute(^__impl::replicator, args); + return substitute(^^__impl::replicator, args); } // end of workaround @@ -88,7 +88,7 @@ template <class T> constexpr void atom(string_builder &b, const T &t) { int i = 0; b.append('{'); - [:expand(std::meta::nonstatic_data_members_of(^T)):] >> [&]<auto dm> { + [:expand(std::meta::nonstatic_data_members_of(^^T)):] >> [&]<auto dm> { if (i != 0) b.append(','); constexpr auto v = @@ -106,7 +106,7 @@ constexpr void atom(string_builder &b, const T &t) { template <class Z> void fast_to_json_string(string_builder &b, const Z &z) { int i = 0; b.append('{'); - [:expand(std::meta::nonstatic_data_members_of(^Z)):] >> [&]<auto dm> { + [:expand(std::meta::nonstatic_data_members_of(^^Z)):] >> [&]<auto dm> { if (i != 0) b.append(','); constexpr auto v = diff --git a/include/simdjson/json_builder/string_builder.h b/include/simdjson/json_builder/string_builder.h index 45e2c3d..9ec278c 100644 --- a/include/simdjson/json_builder/string_builder.h +++ b/include/simdjson/json_builder/string_builder.h @@ -6,6 +6,7 @@ #include <string> #include <string_view> #include <vector> +#include <memory> namespace simdjson { diff --git a/include/simdjson/json_builder/universal_formatter.h b/include/simdjson/json_builder/universal_formatter.h index e32a745..c6e08a7 100644 --- a/include/simdjson/json_builder/universal_formatter.h +++ b/include/simdjson/json_builder/universal_formatter.h @@ -1,6 +1,7 @@ #ifndef SIMDJSON_SERIALIZATION_UNIVERSAL_FORMATTER_HPP #define SIMDJSON_SERIALIZATION_UNIVERSAL_FORMATTER_HPP -#include "simdjson/json_builder/string_builder.hpp" +#include "simdjson/json_builder/string_builder.h" +#include "simdjson/json_builder/json_builder.h" #include <experimental/meta> #include <format> #include <print> @@ -22,16 +23,16 @@ struct universal_formatter { first = false; }; - [:expand(bases_of(^T)):] >> [&]<auto base> { + [:expand(bases_of(^^T)):] >> [&]<auto base> { delim(); sb.append(std::format("{}", (typename[:type_of(base):] const &)(t))); }; - [:expand(nonstatic_data_members_of(^T)):] >> [&]<auto mem> { - delim(); - sb.append(std::format("\"{}\":{}", name_of(mem), - json_builder::atom(sb, t.[:mem:]))); - }; +// [:expand(nonstatic_data_members_of(^^T)):] >> [&]<auto mem> { +// delim(); +// sb.append(std::format("\"{}\":{}", identifier_of(mem), +// json_builder::atom(sb, t.[:mem:]))); +// }; sb.append('}'); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 7db201a..1256c52 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,5 +1,15 @@ +CPMAddPackage( + NAME GTest + GITHUB_REPOSITORY google/googletest + VERSION 1.15.2 +) + add_compile_options(-Wall -Wextra -Weffc++ -Wsign-compare -Wshadow -Wwrite-strings -Wpointer-arith -Winit-self -Wconversion -Wno-sign-conversion) add_executable(user_profile_tests user_profile_tests.cpp) target_link_libraries(user_profile_tests nlohmann_json::nlohmann_json simdjson::serialization simdjson::simdjson) -add_test(user_profile_tests user_profile_tests) \ No newline at end of file +add_test(user_profile_tests user_profile_tests) + +add_executable(universal_formatter_tests universal_formatter_tests.cpp) +target_link_libraries(universal_formatter_tests simdjson::serialization simdjson::simdjson GTest::gtest_main) +add_test(universal_formatter_tests universal_formatter_tests) \ No newline at end of file diff --git a/tests/universal_formatter_tests.cpp b/tests/universal_formatter_tests.cpp new file mode 100644 index 0000000..05b4552 --- /dev/null +++ b/tests/universal_formatter_tests.cpp @@ -0,0 +1,13 @@ +#include "simdjson/json_builder/universal_formatter.h" +#include <gtest/gtest.h> + +TEST(UniversalFormatterTest, EmptyStruct) { + struct Empty {}; + + Empty obj; + simdjson::json_builder::universal_formatter universal_formatter; + simdjson::json_builder::string_builder string_builder; + universal_formatter.format(obj, string_builder); + + EXPECT_EQ(string_builder.view(), "{}"); +} \ No newline at end of file diff --git a/tests/user_profile_tests.cpp b/tests/user_profile_tests.cpp index 29f8cba..0d04115 100644 --- a/tests/user_profile_tests.cpp +++ b/tests/user_profile_tests.cpp @@ -22,7 +22,7 @@ template <auto B, auto E, typename F> constexpr void for_range(F &&f) { } template <typename T> consteval auto member_info(int n) { - return nonstatic_data_members_of(^T)[n]; + return nonstatic_data_members_of(^^T)[n]; } std::mt19937 rng(12345); @@ -195,7 +195,7 @@ std::string nlohmann_serialize(const User &user) { template <typename T> bool compare(const T &user1, const T &user2, const std::string &json) { bool result = true; - for_range<0, nonstatic_data_members_of(^T).size()>([&]<auto i>() { + for_range<0, nonstatic_data_members_of(^^T).size()>([&]<auto i>() { constexpr auto mem = member_info<T>(i); if constexpr (std::equality_comparable<typename[:type_of(mem):]>) { if (user1.[:mem:] != user2.[:mem:]) {