/*
- * Copyright 2017 Facebook, Inc.
+ * Copyright 2012-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <boost/iterator/iterator_adaptor.hpp>
#include <folly/Portability.h>
-#include <folly/ContainerTraits.h>
+#include <folly/Traits.h>
/**
* Code that aids in storing data aligned on block (possibly cache-line)
NS % alignof(T) == 0)>::type> {
typedef void type;
};
-} // namespace detail
+} // namespace detail
template <class T, size_t NS>
class Node<T, NS, typename detail::NodeValid<T,NS>::type> {
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.
//
> type;
};
-} // namespace detail
+} // namespace detail
/**
* Wrapper around iterators to Node to return iterators to the underlying
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_++];
size_t lastCount_; // number of elements in last Node
};
-} // namespace padded
-} // namespace folly
+} // namespace padded
+} // namespace folly