This is an automated email from the ASF dual-hosted git repository. jamesge pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-brpc.git
The following commit(s) were added to refs/heads/master by this push: new 50e41d0a FlatMap's value supports unique_ptr 50e41d0a is described below commit 50e41d0a0b36634b4f275d2bc204ed3ec908bcde Author: gejun.0 <geju...@bytedance.com> AuthorDate: Tue Dec 13 10:47:38 2022 +0800 FlatMap's value supports unique_ptr --- src/butil/containers/flat_map.h | 8 ++++++++ src/butil/containers/flat_map_inl.h | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/butil/containers/flat_map.h b/src/butil/containers/flat_map.h index 6f2deafe..6789c3c7 100644 --- a/src/butil/containers/flat_map.h +++ b/src/butil/containers/flat_map.h @@ -361,11 +361,15 @@ public: // ^^^^^^^^^^^ const K& first_ref() const { return _key; } T& second_ref() { return _value; } + T&& second_movable_ref() { return std::move(_value); } value_type& value_ref() { return *reinterpret_cast<value_type*>(this); } inline static const K& first_ref_from_value(const value_type& v) { return v.first; } inline static const T& second_ref_from_value(const value_type& v) { return v.second; } + inline static T&& second_movable_ref_from_value(value_type& v) + { return std::move(v.second); } + private: const K _key; T _value; @@ -378,12 +382,16 @@ public: explicit FlatMapElement(const K& k) : _key(k) {} const K& first_ref() const { return _key; } FlatMapVoid& second_ref() { return second_ref_from_value(_key); } + FlatMapVoid& second_movable_ref() { return second_ref(); } value_type& value_ref() { return _key; } inline static const K& first_ref_from_value(value_type& v) { return v; } inline static FlatMapVoid& second_ref_from_value(value_type&) { static FlatMapVoid dummy; return dummy; } + inline static const FlatMapVoid& second_movable_ref_from_value(value_type& v) { + return second_ref_from_value(v); + } private: K _key; }; diff --git a/src/butil/containers/flat_map_inl.h b/src/butil/containers/flat_map_inl.h index ad5598c2..e98c88b5 100644 --- a/src/butil/containers/flat_map_inl.h +++ b/src/butil/containers/flat_map_inl.h @@ -394,7 +394,7 @@ size_t FlatMap<_K, _T, _H, _E, _S>::erase(const K2& key, _T* old_value) { } if (_eql(first_node.element().first_ref(), key)) { if (old_value) { - *old_value = first_node.element().second_ref(); + *old_value = first_node.element().second_movable_ref(); } if (first_node.next == NULL) { first_node.element().~Element(); @@ -420,7 +420,7 @@ size_t FlatMap<_K, _T, _H, _E, _S>::erase(const K2& key, _T* old_value) { first_node.next = p->next; const_cast<_K&>(first_node.element().first_ref()) = p->element().first_ref(); - first_node.element().second_ref() = p->element().second_ref(); + first_node.element().second_ref() = p->element().second_movable_ref(); p->element().~Element(); _pool.back(p); } @@ -432,7 +432,7 @@ size_t FlatMap<_K, _T, _H, _E, _S>::erase(const K2& key, _T* old_value) { while (p) { if (_eql(p->element().first_ref(), key)) { if (old_value) { - *old_value = p->element().second_ref(); + *old_value = p->element().second_movable_ref(); } last_p->next = p->next; p->element().~Element(); @@ -616,7 +616,7 @@ bool FlatMap<_K, _T, _H, _E, _S>::resize(size_t nbucket2) { } for (iterator it = begin(); it != end(); ++it) { new_map[Element::first_ref_from_value(*it)] = - Element::second_ref_from_value(*it); + Element::second_movable_ref_from_value(*it); } new_map.swap(*this); return true; --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org For additional commands, e-mail: dev-h...@brpc.apache.org