Remove folly/ContainerTraits.h
authorYedidya Feldblum <yfeldblum@fb.com>
Tue, 31 Oct 2017 05:00:24 +0000 (22:00 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Tue, 31 Oct 2017 05:10:29 +0000 (22:10 -0700)
Summary:
[Folly] Remove `folly/ContainerTraits.h`.

It has some handly helpers, but it is not a real abstraction or utility library. Within Folly, only `folly/Padded.h` uses it, so just rewrite the bit that needs it.

Reviewed By: LeeHowes

Differential Revision: D6183066

fbshipit-source-id: 24a223fe517d21ff531e0fa80172f15d4f963e51

folly/ContainerTraits.h [deleted file]
folly/Makefile.am
folly/Padded.h
folly/test/ContainerTraitsTest.cpp [deleted file]

diff --git a/folly/ContainerTraits.h b/folly/ContainerTraits.h
deleted file mode 100644 (file)
index 2d058f4..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2017 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <folly/Traits.h>
-
-namespace folly {
-
-FOLLY_CREATE_HAS_MEMBER_FN_TRAITS(container_emplace_back_traits, emplace_back);
-
-template <class Container, typename... Args>
-inline
-typename std::enable_if<
-    container_emplace_back_traits<Container, void(Args...)>::value>::type
-container_emplace_back_or_push_back(Container& container, Args&&... args) {
-  container.emplace_back(std::forward<Args>(args)...);
-}
-
-template <class Container, typename... Args>
-inline
-typename std::enable_if<
-    !container_emplace_back_traits<Container, void(Args...)>::value>::type
-container_emplace_back_or_push_back(Container& container, Args&&... args) {
-  using v = typename Container::value_type;
-  container.push_back(v(std::forward<Args>(args)...));
-}
-
-} // namespace folly
index a351f990d26c38aae8387266eef2c97c94fe9470..4873c4ce94b99843c9df87a3f8bef353fc7f24b6 100644 (file)
@@ -45,7 +45,6 @@ nobase_follyinclude_HEADERS = \
        ClockGettimeWrappers.h \
        ConcurrentSkipList.h \
        ConcurrentSkipList-inl.h \
        ClockGettimeWrappers.h \
        ConcurrentSkipList.h \
        ConcurrentSkipList-inl.h \
-       ContainerTraits.h \
        Conv.h \
        CppAttributes.h \
        CpuId.h \
        Conv.h \
        CppAttributes.h \
        CpuId.h \
index 88282d9d12c80a7f04eb0cbd9ec4d6bde2e1dd68..f30e22265bb9dd9dd91edc72beaaebf2b2aae0b4 100644 (file)
@@ -27,8 +27,8 @@
 
 #include <boost/iterator/iterator_adaptor.hpp>
 
 
 #include <boost/iterator/iterator_adaptor.hpp>
 
-#include <folly/ContainerTraits.h>
 #include <folly/Portability.h>
 #include <folly/Portability.h>
+#include <folly/Traits.h>
 
 /**
  * Code that aids in storing data aligned on block (possibly cache-line)
 
 /**
  * Code that aids in storing data aligned on block (possibly cache-line)
@@ -145,6 +145,33 @@ template <class Iter> class Iterator;
 
 namespace detail {
 
 
 namespace detail {
 
+template <typename Void, typename Container, typename... Args>
+struct padded_emplace_back_or_push_back_ {
+  static decltype(auto) go(Container& container, Args&&... args) {
+    using Value = typename Container::value_type;
+    return container.push_back(Value(std::forward<Args>(args)...));
+  }
+};
+
+template <typename Container, typename... Args>
+struct padded_emplace_back_or_push_back_<
+    void_t<decltype(
+        std::declval<Container&>().emplace_back(std::declval<Args>()...))>,
+    Container,
+    Args...> {
+  static decltype(auto) go(Container& container, Args&&... args) {
+    return container.emplace_back(std::forward<Args>(args)...);
+  }
+};
+
+template <typename Container, typename... Args>
+decltype(auto) padded_emplace_back_or_push_back(
+    Container& container,
+    Args&&... args) {
+  using impl = padded_emplace_back_or_push_back_<void, Container, Args...>;
+  return impl::go(container, std::forward<Args>(args)...);
+}
+
 // Helper class to transfer the constness from From (a lvalue reference)
 // and create a lvalue reference to To.
 //
 // Helper class to transfer the constness from From (a lvalue reference)
 // and create a lvalue reference to To.
 //
@@ -495,7 +522,7 @@ class Adaptor {
  private:
   value_type* allocate_back() {
     if (lastCount_ == Node::kElementCount) {
  private:
   value_type* allocate_back() {
     if (lastCount_ == Node::kElementCount) {
-      container_emplace_back_or_push_back(c_);
+      detail::padded_emplace_back_or_push_back(c_);
       lastCount_ = 0;
     }
     return &c_.back().data()[lastCount_++];
       lastCount_ = 0;
     }
     return &c_.back().data()[lastCount_++];
diff --git a/folly/test/ContainerTraitsTest.cpp b/folly/test/ContainerTraitsTest.cpp
deleted file mode 100644 (file)
index 14d27c3..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2017 Facebook, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <folly/ContainerTraits.h>
-
-#include <folly/portability/GTest.h>
-
-using namespace std;
-using namespace folly;
-
-struct Node {
-  size_t copies = 0;
-  Node() noexcept {}
-  Node(const Node& n) noexcept { copies = n.copies; ++copies; }
-  Node(Node&& n) noexcept { swap(copies, n.copies); ++copies; }
-};
-
-template <class T>
-class VectorWrapper {
- public:
-  using value_type = T;
-  vector<T>& underlying;
-  explicit VectorWrapper(vector<T>& v) : underlying(v) {}
-  void push_back(const T& t) { underlying.push_back(t); }
-};
-
-TEST(ContainerTraits, WithoutEmplaceBack) {
-  vector<Node> v;
-  VectorWrapper<Node> vw(v);
-  container_emplace_back_or_push_back(vw);
-  EXPECT_EQ(1, v.at(0).copies);
-}
-
-TEST(ContainerTraits, WithEmplaceBack) {
-  vector<Node> v;
-  container_emplace_back_or_push_back(v);
-  EXPECT_EQ(0, v.at(0).copies);
-}