diff --git a/include/msgpack/iterator.hpp b/include/msgpack/iterator.hpp index 7b538ccc..7050e8d1 100644 --- a/include/msgpack/iterator.hpp +++ b/include/msgpack/iterator.hpp @@ -20,17 +20,22 @@ #define MSGPACK_ITERATOR_HPP #if !defined(MSGPACK_USE_CPP03) +#include + namespace msgpack { - inline object_kv* begin(object_map &map) { return map.ptr; } - inline const object_kv* begin(const object_map &map) { return map.ptr; } - inline object_kv* end(object_map &map) { return map.ptr + map.size; } - inline const object_kv* end(const object_map &map) { return map.ptr + map.size; } - - inline object* begin(object_array &array) { return array.ptr; } - inline const object* begin(const object_array &array) { return array.ptr; } - inline object* end(object_array &array) { return array.ptr + array.size; } - inline const object* end(const object_array &array) { return array.ptr + array.size; } + MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) + { + inline object_kv* begin(object_map &map) { return map.ptr; } + inline const object_kv* begin(const object_map &map) { return map.ptr; } + inline object_kv* end(object_map &map) { return map.ptr + map.size; } + inline const object_kv* end(const object_map &map) { return map.ptr + map.size; } + + inline object* begin(object_array &array) { return array.ptr; } + inline const object* begin(const object_array &array) { return array.ptr; } + inline object* end(object_array &array) { return array.ptr + array.size; } + inline const object* end(const object_array &array) { return array.ptr + array.size; } + } } #endif // !defined(MSGPACK_USE_CPP03) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d59bf1d4..2ad3ab75 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -29,6 +29,7 @@ LIST (APPEND check_PROGRAMS msgpack_c.cpp reference.cpp limit.cpp + iterator.cpp ) IF (MSGPACK_CXX11) diff --git a/test/Makefile.am b/test/Makefile.am index 6979a3ba..44e2c852 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -25,7 +25,8 @@ check_PROGRAMS = \ msgpack_cpp11 \ reference_cpp11 \ reference \ - limit + limit \ + iterator TESTS = $(check_PROGRAMS) @@ -76,4 +77,6 @@ reference_cpp11_SOURCES = reference_cpp11.cpp limit_SOURCES = limit.cpp +iterator_SOURCES = iterator.cpp + EXTRA_DIST = cases.mpac cases_compact.mpac diff --git a/test/iterator.cpp b/test/iterator.cpp new file mode 100644 index 00000000..55f4e9ac --- /dev/null +++ b/test/iterator.cpp @@ -0,0 +1,70 @@ +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +using namespace std; + +#if !defined(MSGPACK_USE_CPP03) +#include + +// C++11 + +constexpr unsigned int VECTOR_SIZE = 100; +constexpr unsigned int MAP_SIZE = 100; + +TEST(iterator, vector) +{ + using vec_type = vector; + vec_type vec; + vec.reserve(VECTOR_SIZE); + for (unsigned int i = 0; i < VECTOR_SIZE; i++) { + vec.push_back(rand()); + } + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, vec); + + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + + auto &msgarr = ret.get().via.array; + auto dist = std::distance(begin(msgarr), end(msgarr)); + auto vecSize = vec.size(); + EXPECT_EQ(dist, vecSize); + + vec_type::iterator correct = std::begin(vec); + for (auto i : msgarr) { + auto u64 = *correct; + EXPECT_EQ(i, u64); + ++correct; + } +} + +TEST(iterator, map) +{ + using map_type = map; + map_type map; + for (unsigned int i = 0; i < MAP_SIZE; i++) { + map[rand()] = rand(); + } + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, map); + + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + + auto &msgmap = ret.get().via.map; + auto dist = std::distance(begin(msgmap), end(msgmap)); + auto mapSize = map.size(); + EXPECT_EQ(dist, mapSize); + + for (auto kv : msgmap) { + auto val = kv.val.via.u64; + auto correct = map[kv.key.via.u64]; + EXPECT_EQ(val, correct); + } +} + +#endif // !defined(MSGPACK_USE_CPP03