diff --git a/src/msgpack/type/tr1/unordered_map.hpp b/src/msgpack/type/tr1/unordered_map.hpp index 79da7fc3..f485c89a 100644 --- a/src/msgpack/type/tr1/unordered_map.hpp +++ b/src/msgpack/type/tr1/unordered_map.hpp @@ -20,17 +20,24 @@ #include "msgpack/object.hpp" -#if defined(_LIBCPP_VERSION) +#if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) +#define MSGPACK_HAS_STD_UNOURDERED_MAP #include #define MSGPACK_STD_TR1 std -#else // _LIBCPP_VERSION +#else // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + +#if __GNUC__ >= 4 + +#define MSGPACK_HAS_STD_TR1_UNOURDERED_MAP #include #define MSGPACK_STD_TR1 std::tr1 -#endif // _LIBCPP_VERSION +#endif // __GNUC__ >= 4 + +#endif // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) namespace msgpack { diff --git a/src/msgpack/type/tr1/unordered_set.hpp b/src/msgpack/type/tr1/unordered_set.hpp index d29dc3e5..252ae233 100644 --- a/src/msgpack/type/tr1/unordered_set.hpp +++ b/src/msgpack/type/tr1/unordered_set.hpp @@ -20,17 +20,24 @@ #include "msgpack/object.hpp" -#if defined(_LIBCPP_VERSION) +#if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) +#define MSGPACK_HAS_STD_UNOURDERED_SET #include #define MSGPACK_STD_TR1 std -#else // _LIBCPP_VERSION +#else // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) + +#if __GNUC__ >= 4 + +#define MSGPACK_HAS_STD_TR1_UNOURDERED_SET #include #define MSGPACK_STD_TR1 std::tr1 -#endif // _LIBCPP_VERSION +#endif // __GNUC__ >= 4 + +#endif // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700) namespace msgpack { diff --git a/test/msgpack_test.cpp b/test/msgpack_test.cpp index 5b60dc5b..5ed61137 100644 --- a/test/msgpack_test.cpp +++ b/test/msgpack_test.cpp @@ -452,10 +452,10 @@ TEST(MSGPACK_STL, simple_buffer_multiset) // TR1 -#ifdef HAVE_TR1_UNORDERED_MAP +#ifdef MSGPACK_HAS_STD_TR1_UNOURDERED_MAP #include #include "msgpack/type/tr1/unordered_map.hpp" -TEST(MSGPACK_TR1, simple_buffer_unordered_map) +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_map) { for (unsigned int k = 0; k < kLoop; k++) { tr1::unordered_map val1; @@ -479,7 +479,7 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_map) } } -TEST(MSGPACK_TR1, simple_buffer_unordered_multimap) +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multimap) { for (unsigned int k = 0; k < kLoop; k++) { tr1::unordered_multimap val1; @@ -513,10 +513,10 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_multimap) } #endif -#ifdef HAVE_TR1_UNORDERED_SET +#ifdef MSGPACK_HAS_STD_TR1_UNOURDERED_SET #include #include "msgpack/type/tr1/unordered_set.hpp" -TEST(MSGPACK_TR1, simple_buffer_unordered_set) +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_set) { for (unsigned int k = 0; k < kLoop; k++) { tr1::unordered_set val1; @@ -538,7 +538,7 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_set) } } -TEST(MSGPACK_TR1, simple_buffer_unordered_multiset) +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multiset) { for (unsigned int k = 0; k < kLoop; k++) { tr1::unordered_multiset val1; @@ -569,6 +569,123 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_multiset) } #endif +#ifdef MSGPACK_HAS_STD_UNOURDERED_MAP +#include +#include "msgpack/type/tr1/unordered_map.hpp" +TEST(MSGPACK_TR1, simple_buffer_unordered_map) +{ + for (unsigned int k = 0; k < kLoop; k++) { + unordered_map val1; + for (unsigned int i = 0; i < kElements; i++) + val1[rand()] = rand(); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::zone z; + msgpack::object obj; + msgpack::unpack_return ret = + msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); + EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); + unordered_map val2; + obj.convert(&val2); + EXPECT_EQ(val1.size(), val2.size()); + unordered_map::const_iterator it; + for (it = val1.begin(); it != val1.end(); ++it) { + EXPECT_TRUE(val2.find(it->first) != val2.end()); + EXPECT_EQ(it->second, val2.find(it->first)->second); + } + } +} + +TEST(MSGPACK_TR1, simple_buffer_unordered_multimap) +{ + for (unsigned int k = 0; k < kLoop; k++) { + unordered_multimap val1; + for (unsigned int i = 0; i < kElements; i++) { + int i1 = rand(); + val1.insert(make_pair(i1, rand())); + val1.insert(make_pair(i1, rand())); + } + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::zone z; + msgpack::object obj; + msgpack::unpack_return ret = + msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); + EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); + unordered_multimap val2; + obj.convert(&val2); + + vector > v1, v2; + unordered_multimap::const_iterator it; + for (it = val1.begin(); it != val1.end(); ++it) + v1.push_back(make_pair(it->first, it->second)); + for (it = val2.begin(); it != val2.end(); ++it) + v2.push_back(make_pair(it->first, it->second)); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_EQ(v1.size(), v2.size()); + sort(v1.begin(), v1.end()); + sort(v2.begin(), v2.end()); + EXPECT_TRUE(v1 == v2); + } +} +#endif + +#ifdef MSGPACK_HAS_STD_UNOURDERED_SET +#include +#include "msgpack/type/tr1/unordered_set.hpp" +TEST(MSGPACK_TR1, simple_buffer_unordered_set) +{ + for (unsigned int k = 0; k < kLoop; k++) { + unordered_set val1; + for (unsigned int i = 0; i < kElements; i++) + val1.insert(rand()); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::zone z; + msgpack::object obj; + msgpack::unpack_return ret = + msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); + EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); + unordered_set val2; + obj.convert(&val2); + EXPECT_EQ(val1.size(), val2.size()); + unordered_set::const_iterator it; + for (it = val1.begin(); it != val1.end(); ++it) + EXPECT_TRUE(val2.find(*it) != val2.end()); + } +} + +TEST(MSGPACK_TR1, simple_buffer_unordered_multiset) +{ + for (unsigned int k = 0; k < kLoop; k++) { + unordered_multiset val1; + for (unsigned int i = 0; i < kElements; i++) + val1.insert(rand()); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::zone z; + msgpack::object obj; + msgpack::unpack_return ret = + msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); + EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); + unordered_multiset val2; + obj.convert(&val2); + + vector v1, v2; + unordered_multiset::const_iterator it; + for (it = val1.begin(); it != val1.end(); ++it) + v1.push_back(*it); + for (it = val2.begin(); it != val2.end(); ++it) + v2.push_back(*it); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_EQ(v1.size(), v2.size()); + sort(v1.begin(), v1.end()); + sort(v2.begin(), v2.end()); + EXPECT_TRUE(v1 == v2); + } +} +#endif + // User-Defined Structures class TestClass