diff --git a/include/boost/unordered/detail/emplace_args.hpp b/include/boost/unordered/detail/emplace_args.hpp index 302b3c0d..d9e5dad7 100644 --- a/include/boost/unordered/detail/emplace_args.hpp +++ b/include/boost/unordered/detail/emplace_args.hpp @@ -379,7 +379,32 @@ BOOST_UNORDERED_CONSTRUCT_FROM_TUPLE(10, std) args.a)); \ } - BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT, + template + inline void construct_impl(T* address, emplace_args1 const& args) + { + new((void*) address) T(boost::forward(args.a0)); + } + + template + inline void construct_impl(T* address, emplace_args2 const& args) + { + new((void*) address) T( + boost::forward(args.a0), + boost::forward(args.a1) + ); + } + + template + inline void construct_impl(T* address, emplace_args3 const& args) + { + new((void*) address) T( + boost::forward(args.a0), + boost::forward(args.a1), + boost::forward(args.a2) + ); + } + + BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT, BOOST_UNORDERED_CONSTRUCT_IMPL, _) #undef BOOST_UNORDERED_CONSTRUCT_IMPL diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index 857901f4..5c85ed7e 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -222,6 +222,64 @@ namespace unordered } #else + template + std::pair emplace(BOOST_FWD_REF(A0) a0) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + ); + } + + template + iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + ).first; + } + + template + std::pair emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + ); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + ).first; + } + + template + std::pair emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + ); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + ).first; + } + #define BOOST_UNORDERED_EMPLACE(z, n, _) \ template < \ BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ @@ -245,14 +303,14 @@ namespace unordered BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \ ) \ { \ - return iterator(table_.emplace( \ + return table_.emplace( \ boost::unordered::detail::create_emplace_args( \ BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \ a) \ - )).first); \ + )).first; \ } - BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT, + BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT, BOOST_UNORDERED_EMPLACE, _) #undef BOOST_UNORDERED_EMPLACE @@ -609,6 +667,64 @@ namespace unordered } #else + template + iterator emplace(BOOST_FWD_REF(A0) a0) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + )); + } + + template + iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + )); + } + + template + iterator emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + )); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + )); + } + + template + iterator emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + )); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + )); + } + #define BOOST_UNORDERED_EMPLACE(z, n, _) \ template < \ BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ @@ -639,7 +755,7 @@ namespace unordered ))); \ } - BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT, + BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT, BOOST_UNORDERED_EMPLACE, _) #undef BOOST_UNORDERED_EMPLACE diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index 43c269d8..bfcd27a3 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -220,6 +220,64 @@ namespace unordered } #else + template + std::pair emplace(BOOST_FWD_REF(A0) a0) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + ); + } + + template + iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + ).first; + } + + template + std::pair emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + ); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + ).first; + } + + template + std::pair emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + ); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + ).first; + } + #define BOOST_UNORDERED_EMPLACE(z, n, _) \ template < \ BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ @@ -243,14 +301,14 @@ namespace unordered BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \ ) \ { \ - return iterator(table_.emplace( \ + return table_.emplace( \ boost::unordered::detail::create_emplace_args( \ BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \ a) \ - )).first); \ + )).first; \ } - BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT, + BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT, BOOST_UNORDERED_EMPLACE, _) #undef BOOST_UNORDERED_EMPLACE @@ -592,6 +650,64 @@ namespace unordered } #else + template + iterator emplace(BOOST_FWD_REF(A0) a0) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + )); + } + + template + iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0) + )); + } + + template + iterator emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + )); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1) + )); + } + + template + iterator emplace( + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + )); + } + + template + iterator emplace_hint(const_iterator, + BOOST_FWD_REF(A0) a0, + BOOST_FWD_REF(A1) a1, + BOOST_FWD_REF(A2) a2) + { + return iterator(table_.emplace( + boost::unordered::detail::create_emplace_args(a0, a1, a2) + )); + } + #define BOOST_UNORDERED_EMPLACE(z, n, _) \ template < \ BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ @@ -622,7 +738,7 @@ namespace unordered ))); \ } - BOOST_PP_REPEAT_FROM_TO(1, BOOST_UNORDERED_EMPLACE_LIMIT, + BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT, BOOST_UNORDERED_EMPLACE, _) #undef BOOST_UNORDERED_EMPLACE