]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
denc: Support boost::container::flat_set
authorAdam C. Emerson <aemerson@redhat.com>
Fri, 23 Dec 2016 17:43:06 +0000 (12:43 -0500)
committerAdam C. Emerson <aemerson@redhat.com>
Tue, 10 Jan 2017 16:40:34 +0000 (11:40 -0500)
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/include/denc.h
src/include/encoding.h
src/test/test_denc.cc

index e56317371091999cda3e6a461d4e9680400f7c47..58b542a453a370b022c9ed2f704395b1e792502c 100644 (file)
@@ -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"
@@ -821,6 +822,15 @@ struct denc_traits<
                                 _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> {
index cbc762351d7b9d8fe91cbbee7dbfd95e0a3692ef..b8a358ef49a6ab92a3d2f9f87b4f674f01f8e120 100644 (file)
@@ -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)
index 3e79d83a940454498025689beb9bc50b27452b67..12a5489f6c2606c0db9cd96808c4d2dbc80c7fae 100644 (file)
@@ -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;