Making StlAllocator<Alloc, void> usable when rebinding.
authorMarcelo Juchem <marcelo@fb.com>
Mon, 8 Apr 2013 21:08:18 +0000 (14:08 -0700)
committerJordan DeLong <jdelong@fb.com>
Sun, 21 Apr 2013 20:21:09 +0000 (13:21 -0700)
Summary:
currently, StlAllocator<Alloc, void> can't be used when you
want an untyped allocator that can be rebound later since it doesn't
carry the SimpleAllocator pointer with it. This diff fixes that.

Test Plan: unit test added

Reviewed By: jon.coens@fb.com

FB internal diff: D766559

folly/Memory.h
folly/test/MemoryTest.cpp

index 005341774c67880e4bf70fac887774793668d20f..e4db242ba22edc24065a249e67bc5416f47944b3 100644 (file)
@@ -78,9 +78,28 @@ template <class Alloc> class StlAllocator<Alloc, void> {
   typedef void value_type;
   typedef void* pointer;
   typedef const void* const_pointer;
+
+  StlAllocator() : alloc_(nullptr) { }
+  explicit StlAllocator(Alloc* alloc) : alloc_(alloc) { }
+
+  Alloc* alloc() const {
+    return alloc_;
+  }
+
   template <class U> struct rebind {
     typedef StlAllocator<Alloc, U> other;
   };
+
+  bool operator!=(const StlAllocator<Alloc, void>& other) const {
+    return alloc_ != other.alloc_;
+  }
+
+  bool operator==(const StlAllocator<Alloc, void>& other) const {
+    return alloc_ == other.alloc_;
+  }
+
+ private:
+  Alloc* alloc_;
 };
 
 template <class Alloc, class T>
index 82f1a50b118fbb7882a35a3866536a584451ae80..c9409d2206148247e31b0cc08258da1b1dbb6861 100644 (file)
@@ -43,6 +43,21 @@ TEST(as_stl_allocator, sanity_check) {
   >::value));
 }
 
+TEST(StlAllocator, void_allocator) {
+  typedef StlAllocator<SysArena, void> void_allocator;
+  SysArena arena;
+  void_allocator valloc(&arena);
+
+  typedef void_allocator::rebind<int>::other int_allocator;
+  int_allocator ialloc(valloc);
+
+  auto i = std::allocate_shared<int>(ialloc, 10);
+  ASSERT_NE(nullptr, i.get());
+  EXPECT_EQ(10, *i);
+  i.reset();
+  ASSERT_EQ(nullptr, i.get());
+}
+
 int main(int argc, char **argv) {
   FLAGS_logtostderr = true;
   google::InitGoogleLogging(argv[0]);