#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"
_denc::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_base<
+ boost::container::flat_set,
+ _denc::setlike_details<boost::container::flat_set<T, Ts...>>,
+ T, Ts...> {};
+
namespace _denc {
template<typename Container>
struct maplike_details : public container_details_base<Container> {
}
}
+// 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)
}
}
-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;