Merge pull request #126 from redboltz/add_zero_size_tuple_support

Added zero size tuple support.
This commit is contained in:
Nobuyuki Kubota 2014-09-16 09:23:31 -07:00
commit 44e41efa0c
5 changed files with 105 additions and 0 deletions

View File

@ -45,6 +45,15 @@ struct StdTuplePacker<Stream, Tuple, 1> {
} }
}; };
template <typename Stream, typename Tuple>
struct StdTuplePacker<Stream, Tuple, 0> {
static void pack (
packer<Stream>&,
const Tuple&) {
}
};
template <typename Stream, typename... Args> template <typename Stream, typename... Args>
const packer<Stream>& operator<< ( const packer<Stream>& operator<< (
packer<Stream>& o, packer<Stream>& o,
@ -75,6 +84,14 @@ struct StdTupleConverter<Tuple, 1> {
} }
}; };
template <typename Tuple>
struct StdTupleConverter<Tuple, 0> {
static void convert (
object const&,
Tuple&) {
}
};
template <typename... Args> template <typename... Args>
object const& operator>> ( object const& operator>> (
object const& o, object const& o,
@ -105,6 +122,14 @@ struct StdTupleToObjectWithZone<Tuple, 1> {
} }
}; };
template <typename Tuple>
struct StdTupleToObjectWithZone<Tuple, 0> {
static void convert (
object::with_zone&,
const Tuple&) {
}
};
template <typename... Args> template <typename... Args>
inline void operator<< ( inline void operator<< (
object::with_zone& o, object::with_zone& o,

View File

@ -109,6 +109,14 @@ struct MsgpackTuplePacker<Stream, Tuple, 1> {
} }
}; };
template <typename Stream, typename Tuple>
struct MsgpackTuplePacker<Stream, Tuple, 0> {
static void pack (
packer<Stream>&,
const Tuple&) {
}
};
template <typename Stream, typename... Args> template <typename Stream, typename... Args>
const packer<Stream>& operator<< ( const packer<Stream>& operator<< (
packer<Stream>& o, packer<Stream>& o,
@ -139,6 +147,14 @@ struct MsgpackTupleConverter<Tuple, 1> {
} }
}; };
template <typename Tuple>
struct MsgpackTupleConverter<Tuple, 0> {
static void convert (
object const&,
Tuple&) {
}
};
template <typename... Args> template <typename... Args>
object const& operator>> ( object const& operator>> (
object const& o, object const& o,
@ -169,6 +185,14 @@ struct MsgpackTupleToObjectWithZone<Tuple, 1> {
} }
}; };
template <typename Tuple>
struct MsgpackTupleToObjectWithZone<Tuple, 0> {
static void convert (
object::with_zone&,
const Tuple&) {
}
};
template <typename... Args> template <typename... Args>
inline void operator<< ( inline void operator<< (
object::with_zone& o, object::with_zone& o,

View File

@ -188,6 +188,33 @@ TEST(MSGPACK_STL, simple_buffer_multiset)
} }
} }
TEST(MSGPACK_TUPLE, simple_tuple)
{
msgpack::sbuffer sbuf;
msgpack::type::tuple<bool, std::string, double> val1(true, "kzk", 12.3);
msgpack::pack(sbuf, val1);
msgpack::unpacked ret;
msgpack::unpack(ret, sbuf.data(), sbuf.size());
msgpack::type::tuple<bool, std::string, double> val2
= ret.get().as<msgpack::type::tuple<bool, std::string, double> >();
EXPECT_EQ(ret.get().via.array.size, 3);
EXPECT_EQ(val1.get<0>(), val2.get<0>());
EXPECT_EQ(val1.get<1>(), val2.get<1>());
EXPECT_EQ(val1.get<2>(), val2.get<2>());
}
TEST(MSGPACK_TUPLE, simple_tuple_empty)
{
msgpack::sbuffer sbuf;
msgpack::type::tuple<> val1;
msgpack::pack(sbuf, val1);
msgpack::unpacked ret;
msgpack::unpack(ret, sbuf.data(), sbuf.size());
ret.get().as<msgpack::type::tuple<> >();
EXPECT_EQ(ret.get().via.array.size, 0);
}
// TR1 // TR1
#ifdef MSGPACK_HAS_STD_TR1_UNOURDERED_MAP #ifdef MSGPACK_HAS_STD_TR1_UNOURDERED_MAP

View File

@ -26,6 +26,17 @@ TEST(MSGPACK_CPP11, simple_tuple)
EXPECT_EQ(val1, val2); EXPECT_EQ(val1, val2);
} }
TEST(MSGPACK_CPP11, simple_tuple_empty)
{
msgpack::sbuffer sbuf;
std::tuple<> val1;
msgpack::pack(sbuf, val1);
msgpack::unpacked ret;
msgpack::unpack(ret, sbuf.data(), sbuf.size());
std::tuple<> val2 = ret.get().as<std::tuple<> >();
EXPECT_EQ(val1, val2);
}
TEST(MSGPACK_CPP11, simple_array) TEST(MSGPACK_CPP11, simple_array)
{ {
for (unsigned int k = 0; k < kLoop; k++) { for (unsigned int k = 0; k < kLoop; k++) {

View File

@ -387,6 +387,15 @@ TEST(object_with_zone, msgpack_tuple)
EXPECT_EQ(msgpack::type::get<0>(obj.as<test_t>()), 1); EXPECT_EQ(msgpack::type::get<0>(obj.as<test_t>()), 1);
} }
TEST(object_with_zone, msgpack_tuple_empty)
{
typedef msgpack::type::tuple<> test_t;
test_t v;
msgpack::zone z;
msgpack::object obj(v, z);
EXPECT_EQ(obj.via.array.size, 0);
}
// TR1 // TR1
#ifdef MSGPACK_HAS_STD_TR1_UNOURDERED_MAP #ifdef MSGPACK_HAS_STD_TR1_UNOURDERED_MAP
@ -680,4 +689,13 @@ TEST(object_with_zone, tuple)
EXPECT_EQ(obj.as<test_t>(), v); EXPECT_EQ(obj.as<test_t>(), v);
} }
TEST(object_with_zone, tuple_empty)
{
typedef tuple<> test_t;
test_t v;
msgpack::zone z;
msgpack::object obj(v, z);
EXPECT_EQ(obj.as<test_t>(), v);
}
#endif #endif