Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/workflows/linux.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
strategy:
fail-fast: false
matrix:
format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "PARQUET", "TOML", "UBJSON", "XML", "YAML", "benchmarks"]
format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "PARQUET", "TOML", "UBJSON", "XML", "YAML", "benchmarks", "headers"]
compiler: [llvm, gcc]
compiler-version: [11, 12, 13, 14, 16, 17, 18]
cxx: [20, 23]
Expand Down Expand Up @@ -82,12 +82,14 @@ jobs:
cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release
elif [[ "${{ matrix.format }}" == "benchmarks" ]]; then
cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_ALL_FORMATS=ON -DCMAKE_BUILD_TYPE=Release
elif [[ "${{ matrix.format }}" == "headers" ]]; then
cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_CHECK_HEADERS=ON -DCMAKE_BUILD_TYPE=Release
else
cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_JSON=OFF -DREFLECTCPP_${{ matrix.format }}=ON -DCMAKE_BUILD_TYPE=Release
fi
cmake --build build -j4
- name: Run tests
if: matrix.format != 'benchmarks'
if: (matrix.format != 'benchmarks') && (matrix.format != 'headers')
run: |
ctest --test-dir build --output-on-failure
- name: Run benchmarks
Expand Down
8 changes: 3 additions & 5 deletions .github/workflows/macos.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
fail-fast: false
matrix:
os: ["macos-latest", "macos-13"]
format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "PARQUET", "TOML", "UBJSON", "XML", "YAML", "benchmarks"]
format: ["tests", "benchmarks"]
name: "${{ matrix.os }} (${{ matrix.format }})"
runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -43,12 +43,10 @@ jobs:
export CMAKE_GENERATOR=Ninja
fi
$CXX --version
if [[ "${{ matrix.format }}" == "JSON" ]]; then
cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
elif [[ "${{ matrix.format }}" == "benchmarks" ]]; then
if [[ "${{ matrix.format }}" == "benchmarks" ]]; then
cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_ALL_FORMATS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
else
cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_JSON=OFF -DREFLECTCPP_${{ matrix.format }}=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_ALL_FORMATS=ON -DREFLECTCPP_CHECK_HEADERS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
fi
cmake --build build -j 4
- name: Run tests
Expand Down
10 changes: 8 additions & 2 deletions .github/workflows/windows.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,23 @@ jobs:
run: |
cmake -S . -B build -G Ninja -DCMAKE_CXX_STANDARD=${{ matrix.cxx }} -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_BENCHMARKS=ON -DREFLECTCPP_ALL_FORMATS=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j4
- name: Check headers
if: matrix.format == 'headers'
run: |
cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_CHECK_HEADERS=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j4
- name: Compile tests (JSON)
if: matrix.format == 'JSON'
run: |
cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j4
- name: Compile tests (Other formats)
if: matrix.format != 'JSON' && matrix.format != 'benchmarks'
if: matrix.format != 'JSON' && matrix.format != 'benchmarks' && matrix.format != 'headers'
run: |
cmake -S . -B build -DCMAKE_CXX_STANDARD=20 -DREFLECTCPP_BUILD_TESTS=ON -DREFLECTCPP_JSON=OFF -DREFLECTCPP_${{ matrix.format }}=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release -j4
- name: Run tests
if: matrix.format != 'benchmarks'
run: |
ctest --test-dir build --output-on-failure
- name: Run benchmarks
Expand Down Expand Up @@ -99,4 +105,4 @@ jobs:
run: |
ctest --test-dir build --output-on-failure



86 changes: 56 additions & 30 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ option(REFLECTCPP_YAML "Enable YAML support" ${REFLECTCPP_ALL_FORMATS})

option(REFLECTCPP_BUILD_BENCHMARKS "Build benchmarks" OFF)
option(REFLECTCPP_BUILD_TESTS "Build tests" OFF)
option(REFLECTCPP_CHECK_HEADERS "Make sure that all headers are self-contained" OFF)

option(REFLECTCPP_USE_BUNDLED_DEPENDENCIES "Use the bundled dependencies" ON)

Expand Down Expand Up @@ -55,7 +56,7 @@ if(REFLECTCPP_BUILD_BENCHMARKS)
set(REFLECTCPP_YAML ON CACHE BOOL "" FORCE)
endif()

if (REFLECTCPP_BUILD_TESTS OR REFLECTCPP_BUILD_BENCHMARKS OR
if (REFLECTCPP_BUILD_TESTS OR REFLECTCPP_BUILD_BENCHMARKS OR REFLECTCPP_CHECK_HEADERS OR
(REFLECTCPP_JSON AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) OR REFLECTCPP_AVRO OR
REFLECTCPP_BSON OR REFLECTCPP_CAPNPROTO OR REFLECTCPP_CBOR OR REFLECTCPP_CSV OR
REFLECTCPP_FLEXBUFFERS OR REFLECTCPP_MSGPACK OR REFLECTCPP_PARQUET OR REFLECTCPP_XML OR
Expand All @@ -73,67 +74,67 @@ endif()
option(REFLECTCPP_USE_VCPKG "Use VCPKG to download and build dependencies" ${REFLECTCPP_USE_VCPKG_DEFAULT})

if (REFLECTCPP_USE_VCPKG)
if (REFLECTCPP_AVRO)
if (REFLECTCPP_AVRO OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "avro")
endif()

if (REFLECTCPP_BSON)
if (REFLECTCPP_BSON OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "bson")
endif()

if (REFLECTCPP_BUILD_BENCHMARKS)
if (REFLECTCPP_BUILD_BENCHMARKS OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "benchmarks")
endif()

if (REFLECTCPP_BUILD_TESTS)
if (REFLECTCPP_BUILD_TESTS OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "tests")
endif()

if (REFLECTCPP_CAPNPROTO)
if (REFLECTCPP_CAPNPROTO OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "capnproto")
endif()

if (REFLECTCPP_CBOR)
if (REFLECTCPP_CBOR OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "cbor")
endif()

if (REFLECTCPP_CSV)
if (REFLECTCPP_CSV OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "csv")
endif()

if (NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES)
list(APPEND VCPKG_MANIFEST_FEATURES "ctre")
endif()

if (REFLECTCPP_FLEXBUFFERS)
if (REFLECTCPP_FLEXBUFFERS OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "flexbuffers")
endif()

if (_REFLECTCPP_NEEDS_JSON_IMPL AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES)
list(APPEND VCPKG_MANIFEST_FEATURES "json")
endif()

if (REFLECTCPP_MSGPACK)
if (REFLECTCPP_MSGPACK OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "msgpack")
endif()

if (REFLECTCPP_PARQUET)
if (REFLECTCPP_PARQUET OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "parquet")
endif()

if (REFLECTCPP_TOML)
if (REFLECTCPP_TOML OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "toml")
endif()

if (REFLECTCPP_UBJSON)
if (REFLECTCPP_UBJSON OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "ubjson")
endif()

if (REFLECTCPP_XML)
if (REFLECTCPP_XML OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "xml")
endif()

if (REFLECTCPP_YAML)
if (REFLECTCPP_YAML OR REFLECTCPP_CHECK_HEADERS)
list(APPEND VCPKG_MANIFEST_FEATURES "yaml")
endif()

Expand Down Expand Up @@ -237,7 +238,7 @@ if (_REFLECTCPP_NEEDS_JSON_IMPL)
endif ()
endif ()

if (REFLECTCPP_AVRO)
if (REFLECTCPP_AVRO OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_avro.cpp
)
Expand Down Expand Up @@ -270,7 +271,7 @@ if (REFLECTCPP_AVRO)
target_link_libraries(reflectcpp PRIVATE jansson::jansson)
endif ()

if (REFLECTCPP_BSON)
if (REFLECTCPP_BSON OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_bson.cpp
)
Expand All @@ -280,7 +281,7 @@ if (REFLECTCPP_BSON)
target_link_libraries(reflectcpp PUBLIC $<IF:$<TARGET_EXISTS:mongo::bson_static>,mongo::bson_static,mongo::bson_shared>)
endif ()

if (REFLECTCPP_CAPNPROTO)
if (REFLECTCPP_CAPNPROTO OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_capnproto.cpp
)
Expand All @@ -295,7 +296,7 @@ if (REFLECTCPP_CAPNPROTO)
target_link_libraries(reflectcpp PUBLIC CapnProto::kj CapnProto::capnp ${CAPNPC_LIB} CapnProto::kj-gzip)
endif ()

if (REFLECTCPP_CBOR)
if (REFLECTCPP_CBOR OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_cbor.cpp
)
Expand All @@ -305,7 +306,7 @@ if (REFLECTCPP_CBOR)
include_directories(PUBLIC ${jsoncons_INCLUDE_DIRS})
endif ()

if (REFLECTCPP_CSV)
if (REFLECTCPP_CSV OR REFLECTCPP_CHECK_HEADERS)
if (NOT TARGET Arrow)
find_package(Arrow CONFIG REQUIRED)
endif()
Expand All @@ -316,7 +317,7 @@ if (REFLECTCPP_CSV)
endif()
endif ()

if (REFLECTCPP_FLEXBUFFERS)
if (REFLECTCPP_FLEXBUFFERS OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_flexbuf.cpp
)
Expand All @@ -326,7 +327,7 @@ if (REFLECTCPP_FLEXBUFFERS)
target_link_libraries(reflectcpp PUBLIC flatbuffers::flatbuffers)
endif ()

if (REFLECTCPP_MSGPACK)
if (REFLECTCPP_MSGPACK OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_msgpack.cpp
)
Expand All @@ -336,7 +337,7 @@ if (REFLECTCPP_MSGPACK)
target_link_libraries(reflectcpp PUBLIC msgpack-c)
endif ()

if (REFLECTCPP_PARQUET)
if (REFLECTCPP_PARQUET OR REFLECTCPP_CHECK_HEADERS)
if (NOT TARGET Arrow)
find_package(Arrow CONFIG REQUIRED)
endif()
Expand All @@ -351,7 +352,7 @@ if (REFLECTCPP_PARQUET)
endif()
endif ()

if (REFLECTCPP_TOML)
if (REFLECTCPP_TOML OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_toml.cpp
)
Expand All @@ -361,7 +362,7 @@ if (REFLECTCPP_TOML)
target_link_libraries(reflectcpp PUBLIC tomlplusplus::tomlplusplus)
endif()

if (REFLECTCPP_UBJSON)
if (REFLECTCPP_UBJSON OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_ubjson.cpp
)
Expand All @@ -371,7 +372,7 @@ if (REFLECTCPP_UBJSON)
include_directories(PUBLIC ${jsoncons_INCLUDE_DIRS})
endif ()

if (REFLECTCPP_XML)
if (REFLECTCPP_XML OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_xml.cpp
)
Expand All @@ -381,7 +382,7 @@ if (REFLECTCPP_XML)
target_link_libraries(reflectcpp PUBLIC pugixml::pugixml)
endif ()

if (REFLECTCPP_YAML)
if (REFLECTCPP_YAML OR REFLECTCPP_CHECK_HEADERS)
list(APPEND REFLECT_CPP_SOURCES
src/reflectcpp_yaml.cpp
)
Expand Down Expand Up @@ -415,6 +416,34 @@ if (REFLECTCPP_BUILD_BENCHMARKS)
add_subdirectory(benchmarks)
endif ()

if(REFLECTCPP_CHECK_HEADERS)
file(GLOB_RECURSE PROJECT_HEADERS "include/*.hpp")

set(TEST_DIR "${CMAKE_CURRENT_BINARY_DIR}/self_contained_tests")
file(MAKE_DIRECTORY "${TEST_DIR}")

foreach(HEADER_FILE ${PROJECT_HEADERS})
if(NOT HEADER_FILE MATCHES "thirdparty")
string(MAKE_C_IDENTIFIER ${HEADER_FILE} HEADER_NAME)
set(TEST_SOURCE_FILE "${TEST_DIR}/test_${HEADER_NAME}.cpp")

file(GENERATE
OUTPUT ${TEST_SOURCE_FILE}
CONTENT "#include \"${HEADER_FILE}\"\n"
)

add_library(check_header_${HEADER_NAME} "${TEST_SOURCE_FILE}")

target_include_directories(check_header_${HEADER_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${ADDITIONAL_INCLUDE_DIRS}
)

add_custom_target(check_${HEADER_NAME} ALL DEPENDS check_header_${HEADER_NAME})
endif()
endforeach()
endif()

if (REFLECTCPP_INSTALL)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
Expand Down Expand Up @@ -451,9 +480,6 @@ if (REFLECTCPP_INSTALL)
)
endif ()


# CPack configuration

# Set general package information
set(CPACK_PACKAGE_NAME "reflectcpp")
set(CPACK_PACKAGE_VENDOR "Reflect C++ Team")
Expand Down
7 changes: 4 additions & 3 deletions include/rfl/Processors.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define RFL_INTERNAL_PROCESSORS_HPP_

#include <type_traits>
#include <utility>

#include "internal/is_add_tags_to_variants_v.hpp"
#include "internal/is_allow_raw_ptrs_v.hpp"
Expand Down Expand Up @@ -69,9 +70,9 @@ struct Processors<Head, Tail...> {

template <class T, class NamedTupleType>
static auto process(NamedTupleType&& _named_tuple) {
static_assert(!add_tags_to_variants_ || !add_namespaced_tags_to_variants_,
"You cannot add both rfl::AddTagsToVariants and "
"rfl::AddNamespacedTagsToVariants.");
static_assert(!add_tags_to_variants_ || !add_namespaced_tags_to_variants_,
"You cannot add both rfl::AddTagsToVariants and "
"rfl::AddNamespacedTagsToVariants.");
return Processors<Tail...>::template process<T>(
Head::template process<T>(std::move(_named_tuple)));
}
Expand Down
1 change: 1 addition & 0 deletions include/rfl/Timestamp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <stdexcept>
#include <string>

#include "Literal.hpp"
#include "Result.hpp"
#include "internal/StringLiteral.hpp"

Expand Down
8 changes: 3 additions & 5 deletions include/rfl/Tuple.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define RFL_TUPLE_HPP_

#include <array>
#include <cstddef>
#include <tuple>
#include <type_traits>
#include <utility>
Expand Down Expand Up @@ -43,9 +44,7 @@ class Tuple {

Tuple(const Tuple& _other) { copy_from_other(_other, seq_); }

Tuple(Tuple&& _other) noexcept {
move_from_other(std::move(_other), seq_);
}
Tuple(Tuple&& _other) noexcept { move_from_other(std::move(_other), seq_); }

~Tuple() { destroy_if_necessary(seq_); }

Expand Down Expand Up @@ -154,8 +153,7 @@ class Tuple {
}

template <int... _is>
void move_from_other(Tuple&& _other,
std::integer_sequence<int, _is...>) {
void move_from_other(Tuple&& _other, std::integer_sequence<int, _is...>) {
const auto move_one = [this]<int _i>(auto&& _other,
std::integral_constant<int, _i>) {
using Type = internal::nth_element_t<_i, Types...>;
Expand Down
Loading
Loading