Skip to content

Commit

Permalink
Add support std::unordered_multiset<Key>
Browse files Browse the repository at this point in the history
  • Loading branch information
Loki-Astari committed Sep 5, 2016
1 parent 5f5bf7a commit c2e3c8b
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/Serialize/SerUtil.h
Expand Up @@ -37,6 +37,7 @@
* C++ 14 Containers
* Traits<std::tuple<Args...>>
* Traits<std::unordered_set<K,V>>
* Traits<std::unordered_multiset<K>>
* Traits<std::unordered_map<K,V>>
* Traits<std::unordered_map<std::string,V>>
*
Expand Down Expand Up @@ -376,6 +377,34 @@ class Traits<std::multiset<Key, Compare, Allocator>>
}
};

/* ------------------------------- Traits<std::unordered_multiset<Key>> ------------------------------- */
template<typename Key, typename Hash, typename KeyEqual, typename Allocator>
class MemberInserter<std::unordered_multiset<Key, Hash, KeyEqual, Allocator>>
{
std::unordered_multiset<Key, Hash, KeyEqual, Allocator>& container;
public:
MemberInserter(std::unordered_multiset<Key, Hash, KeyEqual, Allocator>& container)
: container(container)
{}
void add(std::size_t const&, Key&& value)
{
container.insert(std::forward<Key>(value));
}
};

template<typename Key, typename Hash, typename KeyEqual, typename Allocator>
class Traits<std::unordered_multiset<Key, Hash, KeyEqual, Allocator>>
{
public:
static constexpr TraitType type = TraitType::Array;
typedef ContainerMemberExtractor<std::unordered_multiset<Key, Hash, KeyEqual, Allocator>> MemberExtractor;
static MemberExtractor const& getMembers()
{
static constexpr MemberExtractor memberExtractor;
return memberExtractor;
}
};

/* ------------------------------- Traits<std::map<Key, Value>> ------------------------------- */
template<typename Key,typename T, typename Compare, typename Allocator>
class MemberInserter<std::map<Key, T, Compare, Allocator>>
Expand Down
3 changes: 3 additions & 0 deletions src/Serialize/Serialize.cpp
Expand Up @@ -71,4 +71,7 @@ template void ThorsAnvil::Serialize::Serializer::print<std::unordered_map<int, d
template void ThorsAnvil::Serialize::DeSerializer::parse<std::unordered_map<std::string, bool>>(std::unordered_map<std::string, bool>&);
template void ThorsAnvil::Serialize::DeSerializer::parse<std::unordered_map<int, double>>(std::unordered_map<int, double>&);

template void ThorsAnvil::Serialize::Serializer::print<std::unordered_multiset<int>>(std::unordered_multiset<int> const&);
template void ThorsAnvil::Serialize::DeSerializer::parse<std::unordered_multiset<int>>(std::unordered_multiset<int>&);

#endif
137 changes: 137 additions & 0 deletions src/Serialize/test/SerUnorderedMultiSetTest.cpp
@@ -0,0 +1,137 @@

#include "gtest/gtest.h"
#include "JsonThor.h"
#include "SerUtil.h"
#include <algorithm>

namespace TS = ThorsAnvil::Serialize;

TEST(SerUnorderedMultisetTest, serialize)
{
std::unordered_multiset<int> data{24,8,11,2,2,2};

std::stringstream stream;
stream << TS::jsonExport(data);
std::string result = stream.str();
result.erase(std::remove_if(std::begin(result), std::end(result), [](char x){return ::isspace(x);}), std::end(result));

bool test = result == R"([2,2,2,8,11,24])"
|| result == R"([2,2,8,2,11,24])"
|| result == R"([2,2,8,11,2,24])"
|| result == R"([2,2,8,11,24,2])"
|| result == R"([2,8,2,11,24,2])"
|| result == R"([2,8,11,2,24,2])"
|| result == R"([2,8,11,24,2,2])"
|| result == R"([8,2,11,24,2,2])"
|| result == R"([8,11,2,24,2,2])"
|| result == R"([8,11,24,2,2,2])"
|| result == R"([8,2,2,2,11,24])"
|| result == R"([8,2,2,11,2,24])"
|| result == R"([8,2,2,11,24,2])"
|| result == R"([8,2,11,2,24,2])"
|| result == R"([8,11,2,2,2,24])"
|| result == R"([8,11,2,2,24,2])"

|| result == R"([2,2,2,8,24,11])"
|| result == R"([2,2,8,2,24,11])"
|| result == R"([2,2,8,24,2,11])"
|| result == R"([2,2,8,24,11,2])"
|| result == R"([2,8,2,24,11,2])"
|| result == R"([2,8,24,2,11,2])"
|| result == R"([2,8,24,11,2,2])"
|| result == R"([8,2,24,11,2,2])"
|| result == R"([8,24,2,11,2,2])"
|| result == R"([8,24,11,2,2,2])"
|| result == R"([8,2,2,2,24,11])"
|| result == R"([8,2,2,24,2,11])"
|| result == R"([8,2,2,24,11,2])"
|| result == R"([8,2,24,2,11,2])"
|| result == R"([8,24,2,2,2,11])"
|| result == R"([8,24,2,2,11,2])"

|| result == R"([2,2,2,11,8,24])"
|| result == R"([2,2,11,2,8,24])"
|| result == R"([2,2,11,8,2,24])"
|| result == R"([2,2,11,8,24,2])"
|| result == R"([2,11,2,8,24,2])"
|| result == R"([2,11,8,2,24,2])"
|| result == R"([2,11,8,24,2,2])"
|| result == R"([11,2,8,24,2,2])"
|| result == R"([11,8,2,24,2,2])"
|| result == R"([11,8,24,2,2,2])"
|| result == R"([11,2,2,2,8,24])"
|| result == R"([11,2,2,8,2,24])"
|| result == R"([11,2,2,8,24,2])"
|| result == R"([11,2,8,2,24,2])"
|| result == R"([11,8,2,2,2,24])"
|| result == R"([11,8,2,2,24,2])"

|| result == R"([2,2,2,24,11,8])"
|| result == R"([2,2,24,2,11,8])"
|| result == R"([2,2,24,11,2,8])"
|| result == R"([2,2,24,11,8,2])"
|| result == R"([2,24,2,11,8,2])"
|| result == R"([2,24,11,2,8,2])"
|| result == R"([2,24,11,8,2,2])"
|| result == R"([24,2,11,8,2,2])"
|| result == R"([24,11,2,8,2,2])"
|| result == R"([24,11,8,2,2,2])"
|| result == R"([24,2,2,2,11,8])"
|| result == R"([24,2,2,11,2,8])"
|| result == R"([24,2,2,11,8,2])"
|| result == R"([24,2,11,2,8,2])"
|| result == R"([24,11,2,2,2,8])"
|| result == R"([24,11,2,2,8,2])"

|| result == R"([2,2,2,11,24,8])"
|| result == R"([2,2,11,2,24,8])"
|| result == R"([2,2,11,24,2,8])"
|| result == R"([2,2,11,24,8,2])"
|| result == R"([2,11,2,24,8,2])"
|| result == R"([2,11,24,2,8,2])"
|| result == R"([2,11,24,8,2,2])"
|| result == R"([11,2,24,8,2,2])"
|| result == R"([11,24,2,8,2,2])"
|| result == R"([11,24,8,2,2,2])"
|| result == R"([11,2,2,2,24,8])"
|| result == R"([11,2,2,24,2,8])"
|| result == R"([11,2,2,24,8,2])"
|| result == R"([11,2,24,2,8,2])"
|| result == R"([11,24,2,2,2,8])"
|| result == R"([11,24,2,2,8,2])"

|| result == R"([2,2,2,24,8,11])"
|| result == R"([2,2,24,2,8,11])"
|| result == R"([2,2,24,8,2,11])"
|| result == R"([2,2,24,8,11,2])"
|| result == R"([2,24,2,8,11,2])"
|| result == R"([2,24,8,2,11,2])"
|| result == R"([2,24,8,11,2,2])"
|| result == R"([24,2,8,11,2,2])"
|| result == R"([24,8,2,11,2,2])"
|| result == R"([24,8,11,2,2,2])"
|| result == R"([24,2,2,2,8,11])"
|| result == R"([24,2,2,8,2,11])"
|| result == R"([24,2,2,8,11,2])"
|| result == R"([24,2,8,2,11,2])"
|| result == R"([24,8,2,2,2,11])"
|| result == R"([24,8,2,2,11,2])";
EXPECT_TRUE(test);

}

TEST(SerUnorderedMultisetTest, deSerialize)
{
std::unordered_multiset<int> data;

std::stringstream stream(R"([5,6,8,8,101,123])");
stream >> TS::jsonImport(data);

EXPECT_TRUE(data.find(5) != data.end());
EXPECT_TRUE(data.find(6) != data.end());
EXPECT_TRUE(data.find(8) != data.end());
EXPECT_TRUE(data.find(101) != data.end());
EXPECT_TRUE(data.find(123) != data.end());
EXPECT_EQ(data.count(8), 2);
}

0 comments on commit c2e3c8b

Please sign in to comment.