diff --git a/libdevcore/CommonData.h b/libdevcore/CommonData.h index f587b3533..eb9ab1240 100644 --- a/libdevcore/CommonData.h +++ b/libdevcore/CommonData.h @@ -33,6 +33,8 @@ #include #include #include +#include +#include /// Operators need to stay in the global namespace. @@ -352,4 +354,64 @@ inline std::string findAnyOf(std::string const& _haystack, std::vector +std::enable_if_t::value> +emplaceFromTuple( + std::vector& _vector, + std::tuple _tuple, + std::index_sequence +) +{ + _vector.emplace_back(std::forward(std::get(_tuple))...); +} +template +std::enable_if_t::value> +emplaceFromTuple( + std::vector& _vector, + std::tuple _tuple, + std::index_sequence +) +{ + // try aggregate initialization as well + _vector.emplace_back( + T{std::forward(std::get(_tuple))...} + ); +} +template +void emplaceWithTupleForward(std::vector& _vector, A&& _a) +{ + _vector.emplace_back(std::forward(_a)); +} +template +void +emplaceWithTupleForward(std::vector& _vector, std::tuple _t) +{ + emplaceFromTuple( + _vector, + std::move(_t), + std::make_index_sequence() + ); +} +template +void variadicEmplaceBack(std::vector&) {} +template +void variadicEmplaceBack(std::vector& _vector, A&& _a, Args&&... _args) +{ + emplaceWithTupleForward(_vector, std::forward(_a)); + variadicEmplaceBack(_vector, std::forward(_args)...); +} +} + +template +std::vector make_vector(Args&&... _args) +{ + std::vector result; + result.reserve(sizeof...(_args)); + detail::variadicEmplaceBack(result, std::forward(_args)...); + return result; +} + }