Skip to content

Commit a56bad8

Browse files
authored
Fix std::array<T,0> (#848)
* Fix std::array<T,0> * Add unittests for std::array<T,0> * update std::array
1 parent b4703c4 commit a56bad8

3 files changed

Lines changed: 21 additions & 17 deletions

File tree

include/cereal/types/array.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ namespace cereal
4242
&& std::is_arithmetic<T>::value, void>::type
4343
CEREAL_SAVE_FUNCTION_NAME( Archive & ar, std::array<T, N> const & array )
4444
{
45-
ar( binary_data( array.data(), sizeof(array) ) );
45+
ar( binary_data( array.data(), N*sizeof(T) ) );
4646
}
4747

4848
//! Loading for std::array primitive types
@@ -52,7 +52,7 @@ namespace cereal
5252
&& std::is_arithmetic<T>::value, void>::type
5353
CEREAL_LOAD_FUNCTION_NAME( Archive & ar, std::array<T, N> & array )
5454
{
55-
ar( binary_data( array.data(), sizeof(array) ) );
55+
ar( binary_data( array.data(), N*sizeof(T) ) );
5656
}
5757

5858
//! Saving for std::array all other types

unittests/array.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,26 @@ TEST_SUITE_BEGIN("array");
3131

3232
TEST_CASE("binary_array")
3333
{
34-
test_array<cereal::BinaryInputArchive, cereal::BinaryOutputArchive>();
34+
test_array<cereal::BinaryInputArchive, cereal::BinaryOutputArchive, 0>();
35+
test_array<cereal::BinaryInputArchive, cereal::BinaryOutputArchive, 100>();
3536
}
3637

3738
TEST_CASE("portable_binary_array")
3839
{
39-
test_array<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive>();
40+
test_array<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive, 0>();
41+
test_array<cereal::PortableBinaryInputArchive, cereal::PortableBinaryOutputArchive, 100>();
4042
}
4143

4244
TEST_CASE("xml_array")
4345
{
44-
test_array<cereal::XMLInputArchive, cereal::XMLOutputArchive>();
46+
test_array<cereal::XMLInputArchive, cereal::XMLOutputArchive, 0>();
47+
test_array<cereal::XMLInputArchive, cereal::XMLOutputArchive, 100>();
4548
}
4649

4750
TEST_CASE("json_array")
4851
{
49-
test_array<cereal::JSONInputArchive, cereal::JSONOutputArchive>();
52+
test_array<cereal::JSONInputArchive, cereal::JSONOutputArchive, 0>();
53+
test_array<cereal::JSONInputArchive, cereal::JSONOutputArchive, 100>();
5054
}
5155

5256
TEST_SUITE_END();

unittests/array.hpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,31 +28,31 @@
2828
#define CEREAL_TEST_ARRAY_H_
2929
#include "common.hpp"
3030

31-
template <class IArchive, class OArchive> inline
31+
template <class IArchive, class OArchive, size_t N> inline
3232
void test_array()
3333
{
3434
std::random_device rd;
3535
std::mt19937 gen(rd());
3636

3737
for(int ii=0; ii<100; ++ii)
3838
{
39-
std::array<int, 100> o_podarray;
39+
std::array<int, N> o_podarray;
4040
for(auto & elem : o_podarray)
4141
elem = random_value<int>(gen);
4242

43-
std::array<StructInternalSerialize, 100> o_iserarray;
43+
std::array<StructInternalSerialize, N> o_iserarray;
4444
for(auto & elem : o_iserarray)
4545
elem = StructInternalSerialize( random_value<int>(gen), random_value<int>(gen) );
4646

47-
std::array<StructInternalSplit, 100> o_isplarray;
47+
std::array<StructInternalSplit, N> o_isplarray;
4848
for(auto & elem : o_isplarray)
4949
elem = StructInternalSplit( random_value<int>(gen), random_value<int>(gen) );
5050

51-
std::array<StructExternalSerialize, 100> o_eserarray;
51+
std::array<StructExternalSerialize, N> o_eserarray;
5252
for(auto & elem : o_eserarray)
5353
elem = StructExternalSerialize( random_value<int>(gen), random_value<int>(gen) );
5454

55-
std::array<StructExternalSplit, 100> o_esplarray;
55+
std::array<StructExternalSplit, N> o_esplarray;
5656
for(auto & elem : o_esplarray)
5757
elem = StructExternalSplit( random_value<int>(gen), random_value<int>(gen) );
5858

@@ -67,11 +67,11 @@ void test_array()
6767
oar(o_esplarray);
6868
}
6969

70-
std::array<int, 100> i_podarray;
71-
std::array<StructInternalSerialize, 100> i_iserarray;
72-
std::array<StructInternalSplit, 100> i_isplarray;
73-
std::array<StructExternalSerialize, 100> i_eserarray;
74-
std::array<StructExternalSplit, 100> i_esplarray;
70+
std::array<int, N> i_podarray;
71+
std::array<StructInternalSerialize, N> i_iserarray;
72+
std::array<StructInternalSplit, N> i_isplarray;
73+
std::array<StructExternalSerialize, N> i_eserarray;
74+
std::array<StructExternalSplit, N> i_esplarray;
7575

7676
std::istringstream is(os.str());
7777
{

0 commit comments

Comments
 (0)