From fd566afeb46b7082407a4730f91f80561af38a91 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Mon, 4 Aug 2014 00:52:04 +0900 Subject: [PATCH] Added reference version of unpacker::next(). --- include/msgpack/unpack.hpp | 16 ++++++++----- test/streaming.cc | 46 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 5 deletions(-) diff --git a/include/msgpack/unpack.hpp b/include/msgpack/unpack.hpp index da56cb58..9836d65d 100644 --- a/include/msgpack/unpack.hpp +++ b/include/msgpack/unpack.hpp @@ -786,6 +786,7 @@ public: /*! 4. repeat next() until it retunrs false */ bool next(unpacked* result); + bool next(unpacked& result); /*! 5. check if the size of message doesn't exceed assumption. */ std::size_t message_size() const; @@ -1058,7 +1059,7 @@ inline void unpacker::buffer_consumed(std::size_t size) m_free -= size; } -inline bool unpacker::next(unpacked* result) +inline bool unpacker::next(unpacked& result) { int ret = execute_imp(); @@ -1067,18 +1068,23 @@ inline bool unpacker::next(unpacked* result) } if(ret == 0) { - result->zone().reset(); - result->set(object()); + result.zone().reset(); + result.set(object()); return false; } else { - result->zone().reset( release_zone() ); - result->set(data()); + result.zone().reset( release_zone() ); + result.set(data()); reset(); return true; } } +inline bool unpacker::next(unpacked* result) +{ + return next(*result); +} + inline bool unpacker::execute() { diff --git a/test/streaming.cc b/test/streaming.cc index c390dc18..4ecd2f60 100644 --- a/test/streaming.cc +++ b/test/streaming.cc @@ -17,6 +17,52 @@ TEST(streaming, basic) msgpack::unpacker pac; msgpack::unpacked result; + int count = 0; + while(count < 3) { + pac.reserve_buffer(32*1024); + + // read buffer into pac.buffer() upto + // pac.buffer_capacity() bytes. + size_t len = 1; + memcpy(pac.buffer(), input, len); + input += len; + + pac.buffer_consumed(len); + + while(pac.next(result)) { + msgpack::object obj = result.get(); + switch(count++) { + case 0: + EXPECT_EQ(1, obj.as()); + break; + case 1: + EXPECT_EQ(2, obj.as()); + break; + case 2: + EXPECT_EQ(3, obj.as()); + return; + } + } + + EXPECT_TRUE(input < eof); + } +} + +TEST(streaming, basic_pointer) +{ + msgpack::sbuffer buffer; + + msgpack::packer pk(&buffer); + pk.pack(1); + pk.pack(2); + pk.pack(3); + + const char* input = buffer.data(); + const char* const eof = input + buffer.size(); + + msgpack::unpacker pac; + msgpack::unpacked result; + int count = 0; while(count < 3) { pac.reserve_buffer(32*1024);