Skip to content

Commit dd4c191

Browse files
Added support for the cereal format (#643)
1 parent 424d8d6 commit dd4c191

86 files changed

Lines changed: 2638 additions & 62 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/linux.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
strategy:
1111
fail-fast: false
1212
matrix:
13-
format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "PARQUET", "TOML", "UBJSON", "XML", "YAML", "benchmarks", "headers"]
13+
format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "CEREAL", "FLEXBUFFERS", "MSGPACK", "PARQUET", "TOML", "UBJSON", "XML", "YAML", "benchmarks", "headers"]
1414
compiler: [llvm, gcc]
1515
compiler-version: [11, 12, 13, 14, 16, 17, 18]
1616
cxx: [20, 23]

.github/workflows/windows.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
strategy:
1111
fail-fast: false
1212
matrix:
13-
format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "FLEXBUFFERS", "MSGPACK", "PARQUET", "TOML", "UBJSON", "XML", "YAML", "benchmarks"]
13+
format: ["JSON", "AVRO", "CAPNPROTO", "CBOR", "CEREAL", "FLEXBUFFERS", "MSGPACK", "PARQUET", "TOML", "UBJSON", "XML", "YAML", "benchmarks"]
1414
name: "windows-msvc (${{ matrix.format }})"
1515
concurrency:
1616
group: "windows-${{ github.ref }}-${{ github.job }}-${{ matrix.format }}"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
*.bson
4646
*.capnproto
4747
*.cbor
48+
*.cereal
4849
*.csv
4950
*.json
5051
*.fb

CMakeLists.txt

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ option(REFLECTCPP_AVRO "Enable AVRO support" ${REFLECTCPP_ALL_FORMATS})
1212
option(REFLECTCPP_BSON "Enable BSON support" ${REFLECTCPP_ALL_FORMATS})
1313
option(REFLECTCPP_CAPNPROTO "Enable Cap’n Proto support" ${REFLECTCPP_ALL_FORMATS})
1414
option(REFLECTCPP_CBOR "Enable CBOR support" ${REFLECTCPP_ALL_FORMATS})
15+
option(REFLECTCPP_CEREAL "Enable Cereal support" ${REFLECTCPP_ALL_FORMATS})
1516
option(REFLECTCPP_CSV "Enable CSV support" ${REFLECTCPP_ALL_FORMATS})
1617
option(REFLECTCPP_FLEXBUFFERS "Enable flexbuffers support" ${REFLECTCPP_ALL_FORMATS})
1718
option(REFLECTCPP_MSGPACK "Enable msgpack support" ${REFLECTCPP_ALL_FORMATS})
@@ -49,6 +50,7 @@ if(REFLECTCPP_BUILD_BENCHMARKS)
4950
set(REFLECTCPP_BSON ON CACHE BOOL "" FORCE)
5051
set(REFLECTCPP_CAPNPROTO ON CACHE BOOL "" FORCE)
5152
set(REFLECTCPP_CBOR ON CACHE BOOL "" FORCE)
53+
set(REFLECTCPP_CEREAL ON CACHE BOOL "" FORCE)
5254
set(REFLECTCPP_FLEXBUFFERS ON CACHE BOOL "" FORCE)
5355
set(REFLECTCPP_MSGPACK ON CACHE BOOL "" FORCE)
5456
set(REFLECTCPP_XML ON CACHE BOOL "" FORCE)
@@ -57,11 +59,25 @@ if(REFLECTCPP_BUILD_BENCHMARKS)
5759
set(REFLECTCPP_YAML ON CACHE BOOL "" FORCE)
5860
endif()
5961

60-
if (REFLECTCPP_BUILD_TESTS OR REFLECTCPP_BUILD_BENCHMARKS OR REFLECTCPP_CHECK_HEADERS OR
61-
(REFLECTCPP_JSON AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) OR REFLECTCPP_AVRO OR
62-
REFLECTCPP_BSON OR REFLECTCPP_CAPNPROTO OR REFLECTCPP_CBOR OR REFLECTCPP_CSV OR
63-
REFLECTCPP_FLEXBUFFERS OR REFLECTCPP_MSGPACK OR REFLECTCPP_PARQUET OR REFLECTCPP_XML OR
64-
REFLECTCPP_TOML OR REFLECTCPP_UBJSON OR REFLECTCPP_YAML)
62+
if (
63+
REFLECTCPP_BUILD_TESTS OR
64+
REFLECTCPP_BUILD_BENCHMARKS OR
65+
REFLECTCPP_CHECK_HEADERS OR
66+
(REFLECTCPP_JSON AND NOT REFLECTCPP_USE_BUNDLED_DEPENDENCIES) OR
67+
REFLECTCPP_AVRO OR
68+
REFLECTCPP_BSON OR
69+
REFLECTCPP_CAPNPROTO OR
70+
REFLECTCPP_CBOR OR
71+
REFLECTCPP_CEREAL OR
72+
REFLECTCPP_CSV OR
73+
REFLECTCPP_FLEXBUFFERS OR
74+
REFLECTCPP_MSGPACK OR
75+
REFLECTCPP_PARQUET OR
76+
REFLECTCPP_XML OR
77+
REFLECTCPP_TOML OR
78+
REFLECTCPP_UBJSON OR
79+
REFLECTCPP_YAML
80+
)
6581
# enable vcpkg per default if features other than JSON are required
6682
set(REFLECTCPP_USE_VCPKG_DEFAULT ON)
6783
endif()
@@ -98,7 +114,11 @@ if (REFLECTCPP_USE_VCPKG)
98114
if (REFLECTCPP_CBOR OR REFLECTCPP_CHECK_HEADERS)
99115
list(APPEND VCPKG_MANIFEST_FEATURES "cbor")
100116
endif()
101-
117+
118+
if (REFLECTCPP_CEREAL OR REFLECTCPP_CHECK_HEADERS)
119+
list(APPEND VCPKG_MANIFEST_FEATURES "cereal")
120+
endif()
121+
102122
if (REFLECTCPP_CSV OR REFLECTCPP_CHECK_HEADERS)
103123
list(APPEND VCPKG_MANIFEST_FEATURES "csv")
104124
endif()
@@ -172,10 +192,6 @@ else()
172192
target_compile_options(reflectcpp PRIVATE
173193
$<$<CONFIG:Debug>:
174194
-Wall -Wextra -Wpedantic -Wshadow -Wconversion
175-
#-Wnull-dereference -Wold-style-cast
176-
#-g3 -fno-omit-frame-pointer
177-
#-fsanitize=address,undefined
178-
#-fno-sanitize-recover=undefined
179195
>
180196
)
181197
endif()
@@ -312,6 +328,16 @@ if (REFLECTCPP_CBOR OR REFLECTCPP_CHECK_HEADERS)
312328
include_directories(PUBLIC ${jsoncons_INCLUDE_DIRS})
313329
endif ()
314330

331+
if (REFLECTCPP_CEREAL OR REFLECTCPP_CHECK_HEADERS)
332+
list(APPEND REFLECT_CPP_SOURCES
333+
src/reflectcpp_cereal.cpp
334+
)
335+
if (NOT TARGET cereal::cereal)
336+
find_package(cereal CONFIG REQUIRED)
337+
endif ()
338+
target_link_libraries(reflectcpp PUBLIC cereal::cereal)
339+
endif()
340+
315341
if (REFLECTCPP_CSV OR REFLECTCPP_CHECK_HEADERS)
316342
if (NOT TARGET Arrow)
317343
find_package(Arrow CONFIG REQUIRED)

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ The following table lists the serialization formats currently supported by refle
6969
| BSON | [libbson](https://github.com/mongodb/mongo-c-driver) | >= 1.25.1 | Apache 2.0 | JSON-like binary format |
7070
| Cap'n Proto | [capnproto](https://capnproto.org) | >= 1.0.2 | MIT | Schemaful binary format |
7171
| CBOR | [jsoncons](https://github.com/danielaparker/jsoncons)| >= 0.176.0 | BSL 1.0 | JSON-like binary format |
72+
| Cereal | [Cereal](https://uscilab.github.io/cereal/) | >= 1.3.2 | BSD | C++ serialization library with multiple formats |
7273
| CSV | [Apache Arrow](https://arrow.apache.org/) | >= 21.0.0 | Apache 2.0 | Tabular textual format |
7374
| flexbuffers | [flatbuffers](https://github.com/google/flatbuffers) | >= 23.5.26 | Apache 2.0 | Schema-less version of flatbuffers, binary format |
7475
| msgpack | [msgpack-c](https://github.com/msgpack/msgpack-c) | >= 6.0.0 | BSL 1.0 | JSON-like binary format |
@@ -155,6 +156,7 @@ rfl::avro::write(homer);
155156
rfl::bson::write(homer);
156157
rfl::capnproto::write(homer);
157158
rfl::cbor::write(homer);
159+
rfl::cereal::write(homer);
158160
rfl::flexbuf::write(homer);
159161
rfl::msgpack::write(homer);
160162
rfl::toml::write(homer);
@@ -165,6 +167,7 @@ rfl::avro::read<Person>(avro_bytes);
165167
rfl::bson::read<Person>(bson_bytes);
166168
rfl::capnproto::read<Person>(capnproto_bytes);
167169
rfl::cbor::read<Person>(cbor_bytes);
170+
rfl::cereal::read<Person>(cereal_bytes);
168171
rfl::flexbuf::read<Person>(flexbuf_bytes);
169172
rfl::msgpack::read<Person>(msgpack_bytes);
170173
rfl::toml::read<Person>(toml_string);

benchmarks/all/canada_read.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <rfl/bson.hpp>
55
#include <rfl/capnproto.hpp>
66
#include <rfl/cbor.hpp>
7+
#include <rfl/cereal.hpp>
78
#include <rfl/flexbuf.hpp>
89
#include <rfl/json.hpp>
910
#include <rfl/msgpack.hpp>
@@ -104,6 +105,17 @@ static void BM_canada_read_reflect_cpp_cbor_without_field_names(
104105
}
105106
BENCHMARK(BM_canada_read_reflect_cpp_cbor_without_field_names);
106107

108+
static void BM_canada_read_reflect_cpp_cereal(benchmark::State &state) {
109+
const auto data = rfl::cereal::write(load_data());
110+
for (auto _ : state) {
111+
const auto res = rfl::cereal::read<FeatureCollection>(data);
112+
if (!res) {
113+
std::cout << res.error().what() << std::endl;
114+
}
115+
}
116+
}
117+
BENCHMARK(BM_canada_read_reflect_cpp_cereal);
118+
107119
static void BM_canada_read_reflect_cpp_flexbuf(benchmark::State &state) {
108120
const auto data = rfl::flexbuf::write(load_data());
109121
for (auto _ : state) {

benchmarks/all/canada_write.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <rfl/bson.hpp>
55
#include <rfl/capnproto.hpp>
66
#include <rfl/cbor.hpp>
7+
#include <rfl/cereal.hpp>
78
#include <rfl/flexbuf.hpp>
89
#include <rfl/json.hpp>
910
#include <rfl/msgpack.hpp>
@@ -103,6 +104,17 @@ static void BM_canada_write_reflect_cpp_cbor_without_field_names(
103104
}
104105
BENCHMARK(BM_canada_write_reflect_cpp_cbor_without_field_names);
105106

107+
static void BM_canada_write_reflect_cpp_cereal(benchmark::State &state) {
108+
const auto data = load_data();
109+
for (auto _ : state) {
110+
const auto output = rfl::cereal::write(data);
111+
if (output.size() == 0) {
112+
std::cout << "No output" << std::endl;
113+
}
114+
}
115+
}
116+
BENCHMARK(BM_canada_write_reflect_cpp_cereal);
117+
106118
static void BM_canada_write_reflect_cpp_flexbuf_without_field_names(
107119
benchmark::State &state) {
108120
const auto data = load_data();

benchmarks/all/licenses_read.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <rfl/bson.hpp>
66
#include <rfl/capnproto.hpp>
77
#include <rfl/cbor.hpp>
8+
#include <rfl/cereal.hpp>
89
#include <rfl/flexbuf.hpp>
910
#include <rfl/json.hpp>
1011
#include <rfl/msgpack.hpp>
@@ -120,6 +121,17 @@ static void BM_licenses_read_reflect_cpp_cbor_without_field_names(
120121
}
121122
BENCHMARK(BM_licenses_read_reflect_cpp_cbor_without_field_names);
122123

124+
static void BM_licenses_read_reflect_cpp_cereal(benchmark::State &state) {
125+
const auto data = rfl::cereal::write(load_data());
126+
for (auto _ : state) {
127+
const auto res = rfl::cereal::read<Licenses>(data);
128+
if (!res) {
129+
std::cout << res.error().what() << std::endl;
130+
}
131+
}
132+
}
133+
BENCHMARK(BM_licenses_read_reflect_cpp_cereal);
134+
123135
static void BM_licenses_read_reflect_cpp_flexbuf(benchmark::State &state) {
124136
const auto data = rfl::flexbuf::write(load_data());
125137
for (auto _ : state) {

benchmarks/all/licenses_write.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <rfl/bson.hpp>
66
#include <rfl/capnproto.hpp>
77
#include <rfl/cbor.hpp>
8+
#include <rfl/cereal.hpp>
89
#include <rfl/flexbuf.hpp>
910
#include <rfl/json.hpp>
1011
#include <rfl/msgpack.hpp>
@@ -120,6 +121,17 @@ static void BM_licenses_write_reflect_cpp_cbor_without_field_names(
120121
}
121122
BENCHMARK(BM_licenses_write_reflect_cpp_cbor_without_field_names);
122123

124+
static void BM_licenses_write_reflect_cpp_cereal(benchmark::State &state) {
125+
const auto data = load_data();
126+
for (auto _ : state) {
127+
const auto output = rfl::cereal::write(data);
128+
if (output.size() == 0) {
129+
std::cout << "No output" << std::endl;
130+
}
131+
}
132+
}
133+
BENCHMARK(BM_licenses_write_reflect_cpp_cereal);
134+
123135
static void BM_licenses_write_reflect_cpp_flexbuf(benchmark::State &state) {
124136
const auto data = load_data();
125137
for (auto _ : state) {

benchmarks/all/person_read.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <rfl/bson.hpp>
55
#include <rfl/capnproto.hpp>
66
#include <rfl/cbor.hpp>
7+
#include <rfl/cereal.hpp>
78
#include <rfl/flexbuf.hpp>
89
#include <rfl/json.hpp>
910
#include <rfl/msgpack.hpp>
@@ -98,6 +99,17 @@ static void BM_person_read_reflect_cpp_cbor_without_field_names(
9899
}
99100
BENCHMARK(BM_person_read_reflect_cpp_cbor_without_field_names);
100101

102+
static void BM_person_read_reflect_cpp_cereal(benchmark::State &state) {
103+
const auto data = rfl::cereal::write(load_data());
104+
for (auto _ : state) {
105+
const auto res = rfl::cereal::read<Person>(data);
106+
if (!res) {
107+
std::cout << res.error().what() << std::endl;
108+
}
109+
}
110+
}
111+
BENCHMARK(BM_person_read_reflect_cpp_cereal);
112+
101113
static void BM_person_read_reflect_cpp_flexbuf(benchmark::State &state) {
102114
const auto data = rfl::flexbuf::write(load_data());
103115
for (auto _ : state) {

0 commit comments

Comments
 (0)