Branch data Line data Source code
# 1 : : // Copyright (c) 2019 The Bitcoin Core developers # 2 : : // Distributed under the MIT software license, see the accompanying # 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. # 4 : : # 5 : : #ifndef BITCOIN_UTIL_VECTOR_H # 6 : : #define BITCOIN_UTIL_VECTOR_H # 7 : : # 8 : : #include <initializer_list> # 9 : : #include <type_traits> # 10 : : #include <vector> # 11 : : # 12 : : /** Construct a vector with the specified elements. # 13 : : * # 14 : : * This is preferable over the list initializing constructor of std::vector: # 15 : : * - It automatically infers the element type from its arguments. # 16 : : * - If any arguments are rvalue references, they will be moved into the vector # 17 : : * (list initialization always copies). # 18 : : */ # 19 : : template<typename... Args> # 20 : : inline std::vector<typename std::common_type<Args...>::type> Vector(Args&&... args) # 21 : 696846 : { # 22 : 696846 : std::vector<typename std::common_type<Args...>::type> ret; # 23 : 696846 : ret.reserve(sizeof...(args)); # 24 : : // The line below uses the trick from https://www.experts-exchange.com/articles/32502/None-recursive-variadic-templates-with-std-initializer-list.html # 25 : 696846 : (void)std::initializer_list<int>{(ret.emplace_back(std::forward<Args>(args)), 0)...}; # 26 : 696846 : return ret; # 27 : 696846 : } # 28 : : # 29 : : /** Concatenate two vectors, moving elements. */ # 30 : : template<typename V> # 31 : : inline V Cat(V v1, V&& v2) # 32 : 9600 : { # 33 : 9600 : v1.reserve(v1.size() + v2.size()); # 34 [ + + ][ + + ]: 210765 : for (auto& arg : v2) { # [ + + ] # 35 : 210765 : v1.push_back(std::move(arg)); # 36 : 210765 : } # 37 : 9600 : return v1; # 38 : 9600 : } # 39 : : # 40 : : /** Concatenate two vectors. */ # 41 : : template<typename V> # 42 : : inline V Cat(V v1, const V& v2) # 43 : 150334 : { # 44 : 150334 : v1.reserve(v1.size() + v2.size()); # 45 [ + + ][ - + ]: 3450546 : for (const auto& arg : v2) { # [ + + ][ + + ] # 46 : 3450546 : v1.push_back(arg); # 47 : 3450546 : } # 48 : 150334 : return v1; # 49 : 150334 : } # 50 : : # 51 : : #endif // BITCOIN_UTIL_VECTOR_H