summaryrefslogtreecommitdiff
path: root/absl/container/internal/common.h
diff options
context:
space:
mode:
Diffstat (limited to 'absl/container/internal/common.h')
-rw-r--r--absl/container/internal/common.h23
1 files changed, 18 insertions, 5 deletions
diff --git a/absl/container/internal/common.h b/absl/container/internal/common.h
index b06e7113..591d3ea1 100644
--- a/absl/container/internal/common.h
+++ b/absl/container/internal/common.h
@@ -77,10 +77,18 @@ class node_handle_base {
protected:
friend struct CommonAccess;
- node_handle_base(const allocator_type& a, slot_type* s) : alloc_(a) {
+ struct transfer_tag_t {};
+ node_handle_base(transfer_tag_t, const allocator_type& a, slot_type* s)
+ : alloc_(a) {
PolicyTraits::transfer(alloc(), slot(), s);
}
+ struct move_tag_t {};
+ node_handle_base(move_tag_t, const allocator_type& a, slot_type* s)
+ : alloc_(a) {
+ PolicyTraits::construct(alloc(), slot(), s);
+ }
+
void destroy() {
if (!empty()) {
PolicyTraits::destroy(alloc(), slot());
@@ -121,7 +129,7 @@ class node_handle : public node_handle_base<PolicyTraits, Alloc> {
private:
friend struct CommonAccess;
- node_handle(const Alloc& a, typename Base::slot_type* s) : Base(a, s) {}
+ using Base::Base;
};
// For maps.
@@ -148,7 +156,7 @@ class node_handle<Policy, PolicyTraits, Alloc,
private:
friend struct CommonAccess;
- node_handle(const Alloc& a, typename Base::slot_type* s) : Base(a, s) {}
+ using Base::Base;
};
// Provide access to non-public node-handle functions.
@@ -164,8 +172,13 @@ struct CommonAccess {
}
template <typename T, typename... Args>
- static T Make(Args&&... args) {
- return T(std::forward<Args>(args)...);
+ static T Transfer(Args&&... args) {
+ return T(typename T::transfer_tag_t{}, std::forward<Args>(args)...);
+ }
+
+ template <typename T, typename... Args>
+ static T Move(Args&&... args) {
+ return T(typename T::move_tag_t{}, std::forward<Args>(args)...);
}
};