From b22935cd23251a9958f73242cb1dc44dfc75c5f5 Mon Sep 17 00:00:00 2001 From: Yedidya Feldblum Date: Mon, 30 Oct 2017 22:00:24 -0700 Subject: [PATCH] Remove folly/ContainerTraits.h 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 | 42 ------------------------ folly/Makefile.am | 1 - folly/Padded.h | 31 ++++++++++++++++-- folly/test/ContainerTraitsTest.cpp | 51 ------------------------------ 4 files changed, 29 insertions(+), 96 deletions(-) delete mode 100644 folly/ContainerTraits.h delete mode 100644 folly/test/ContainerTraitsTest.cpp diff --git a/folly/ContainerTraits.h b/folly/ContainerTraits.h deleted file mode 100644 index 2d058f43..00000000 --- a/folly/ContainerTraits.h +++ /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 - -namespace folly { - -FOLLY_CREATE_HAS_MEMBER_FN_TRAITS(container_emplace_back_traits, emplace_back); - -template -inline -typename std::enable_if< - container_emplace_back_traits::value>::type -container_emplace_back_or_push_back(Container& container, Args&&... args) { - container.emplace_back(std::forward(args)...); -} - -template -inline -typename std::enable_if< - !container_emplace_back_traits::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)...)); -} - -} // namespace folly diff --git a/folly/Makefile.am b/folly/Makefile.am index a351f990..4873c4ce 100644 --- a/folly/Makefile.am +++ b/folly/Makefile.am @@ -45,7 +45,6 @@ nobase_follyinclude_HEADERS = \ ClockGettimeWrappers.h \ ConcurrentSkipList.h \ ConcurrentSkipList-inl.h \ - ContainerTraits.h \ Conv.h \ CppAttributes.h \ CpuId.h \ diff --git a/folly/Padded.h b/folly/Padded.h index 88282d9d..f30e2226 100644 --- a/folly/Padded.h +++ b/folly/Padded.h @@ -27,8 +27,8 @@ #include -#include #include +#include /** * Code that aids in storing data aligned on block (possibly cache-line) @@ -145,6 +145,33 @@ template class Iterator; namespace detail { +template +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)...)); + } +}; + +template +struct padded_emplace_back_or_push_back_< + void_t().emplace_back(std::declval()...))>, + Container, + Args...> { + static decltype(auto) go(Container& container, Args&&... args) { + return container.emplace_back(std::forward(args)...); + } +}; + +template +decltype(auto) padded_emplace_back_or_push_back( + Container& container, + Args&&... args) { + using impl = padded_emplace_back_or_push_back_; + return impl::go(container, std::forward(args)...); +} + // 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) { - container_emplace_back_or_push_back(c_); + detail::padded_emplace_back_or_push_back(c_); lastCount_ = 0; } return &c_.back().data()[lastCount_++]; diff --git a/folly/test/ContainerTraitsTest.cpp b/folly/test/ContainerTraitsTest.cpp deleted file mode 100644 index 14d27c3f..00000000 --- a/folly/test/ContainerTraitsTest.cpp +++ /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 - -#include - -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 VectorWrapper { - public: - using value_type = T; - vector& underlying; - explicit VectorWrapper(vector& v) : underlying(v) {} - void push_back(const T& t) { underlying.push_back(t); } -}; - -TEST(ContainerTraits, WithoutEmplaceBack) { - vector v; - VectorWrapper vw(v); - container_emplace_back_or_push_back(vw); - EXPECT_EQ(1, v.at(0).copies); -} - -TEST(ContainerTraits, WithEmplaceBack) { - vector v; - container_emplace_back_or_push_back(v); - EXPECT_EQ(0, v.at(0).copies); -} -- 2.34.1