Skip to content

Commit

Permalink
denc: Support boost::container::flat_set
Browse files Browse the repository at this point in the history
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
  • Loading branch information
adamemerson committed Dec 23, 2016
1 parent c9d10aa commit 8361514
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 8 deletions.
9 changes: 9 additions & 0 deletions src/include/denc.h
Expand Up @@ -32,6 +32,7 @@
#include <type_traits>
#include <boost/intrusive/set.hpp>
#include <boost/container/flat_map.hpp>
#include <boost/container/flat_set.hpp>

#include "include/int_types.h"
#include "include/intarith.h"
Expand Down Expand Up @@ -825,6 +826,14 @@ struct denc_traits<
: public denc_container<std::set,
setlike_details<std::set<T, Ts...>>,
T, Ts...> {};
template<typename T, typename ...Ts>
struct denc_traits<
boost::container::flat_set<T, Ts...>,
typename std::enable_if<denc_traits<T>::supported != 0>::type>
: public denc_container<boost::container::flat_set,
setlike_details<boost::container::flat_set<
T, Ts...>>,
T, Ts...> {};

template<typename Container>
struct maplike_details : public container_details_base<Container> {
Expand Down
44 changes: 44 additions & 0 deletions src/include/encoding.h
Expand Up @@ -504,6 +504,50 @@ inline typename std::enable_if<!traits::supported>::type
}
}

// boost::container::flat_set<T>
template<class T, class Comp, class Alloc, typename traits=denc_traits<T>>
inline typename std::enable_if<!traits::supported>::type
encode(const boost::container::flat_set<T, Comp, Alloc>& s, bufferlist& bl)
{
__u32 n = (__u32)(s.size());
encode(n, bl);
for (const auto& e : s)
encode(e, bl);
}
template<class T, class Comp, class Alloc, typename traits=denc_traits<T>>
inline typename std::enable_if<!traits::supported>::type
decode(boost::container::flat_set<T, Comp, Alloc>& s, bufferlist::iterator& p)
{
__u32 n;
decode(n, p);
s.clear();
while (n--) {
T v;
decode(v, p);
s.insert(v);
}
}

template<class T, class Comp, class Alloc, typename traits=denc_traits<T>>
inline typename std::enable_if<!traits::supported>::type
encode_nohead(const boost::container::flat_set<T, Comp, Alloc>& s,
bufferlist& bl)
{
for (const auto& e : s)
encode(e, bl);
}
template<class T, class Comp, class Alloc, typename traits=denc_traits<T>>
inline typename std::enable_if<!traits::supported>::type
decode_nohead(int len, boost::container::flat_set<T, Comp, Alloc>& s,
bufferlist::iterator& p)
{
for (int i=0; i<len; i++) {
T v;
decode(v, p);
s.insert(v);
}
}

// multiset
template<class T, class Comp, class Alloc>
inline void encode(const std::multiset<T,Comp,Alloc>& s, bufferlist& bl)
Expand Down
32 changes: 24 additions & 8 deletions src/test/test_denc.cc
Expand Up @@ -287,33 +287,49 @@ TEST(denc, list)
}
}

TEST(denc, set)
{
template<template<class> class C>
void test_setlike(const char* c) {
{
cout << "set<string>" << std::endl;
std::set<string> s;
cout << c << "<std::string>" << std::endl;
C<std::string> s;
s.insert("foo");
s.insert("bar");
s.insert("baz");
test_denc(s);
}
{
cout << "set<int32_t>" << std::endl;
std::set<int32_t> s;
cout << c << "<int32_t>" << std::endl;
C<int32_t> s;
s.insert(1);
s.insert(2);
s.insert(3);
test_denc(s);
}
{
cout << "set<legacy_t>" << std::endl;
std::set<legacy_t> s;
cout << c << "<legacy_t>" << std::endl;
C<legacy_t> s;
s.insert(legacy_t(1));
s.insert(legacy_t(2));
test_encode_decode(s);
}
}

template<typename T>
using default_set = std::set<T>;

TEST(denc, set)
{
test_setlike<default_set>("std::set");
}

template<typename T>
using default_flat_set= boost::container::flat_set<T>;

TEST(denc, flat_set)
{
test_setlike<default_flat_set>("std::set");
}

struct foo_t {
int32_t a = 0;
uint64_t b = 123;
Expand Down

0 comments on commit 8361514

Please sign in to comment.