From 771943e291bb64764d24aef0832f2908b7160cc0 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 7 Sep 2023 08:33:33 -0700 Subject: [PATCH] Add `to_pointer` helper for converting raw pointers to fancy This helps us avoid an unconditional nullptr check when the user's pointer type is fancy --- include/boost/unordered/detail/foa/table.hpp | 32 ++++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/include/boost/unordered/detail/foa/table.hpp b/include/boost/unordered/detail/foa/table.hpp index f82586a5..1afcc7a2 100644 --- a/include/boost/unordered/detail/foa/table.hpp +++ b/include/boost/unordered/detail/foa/table.hpp @@ -133,22 +133,28 @@ private: template friend class table_erase_return_type; template friend class table; - table_iterator(group_type* pg,std::size_t n,const table_element_type* p_) + template< + typename Ptr,typename Ptr2, + typename std::enable_if::value>::type* = nullptr + > + static Ptr to_pointer(Ptr2 p) { - if(pg) - { - using pointer_traits=boost::pointer_traits; - pc=pointer_traits::pointer_to( - reinterpret_cast(const_cast(pg))[n]); - } - - if(p_) - { - using pointer_traits=boost::pointer_traits; - p=pointer_traits::pointer_to(*const_cast(p_)); - } + if(!p){return nullptr;} + return boost::pointer_traits::pointer_to(*p); } + template + static Ptr to_pointer(Ptr p) + { + return p; + } + + table_iterator(group_type* pg,std::size_t n,const table_element_type* p_): + pc{to_pointer( + reinterpret_cast(const_cast(pg))+n)}, + p{to_pointer(const_cast(p_))} + {} + inline void increment()noexcept { BOOST_ASSERT(p!=nullptr);