-
-
Save outro56/5e48dfc6c61f0ffc5191c1cf6189a6c6 to your computer and use it in GitHub Desktop.
Revisions
-
outro56 revised this gist
Sep 15, 2020 . 2 changed files with 3 additions and 3 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,9 +1,6 @@ #ifndef CMUOH_MAKE_VECTOR_HPP_ #define CMUOH_MAKE_VECTOR_HPP_ #include "make_vector_details.hpp" namespace cmuoh { This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,5 +1,8 @@ #ifdefine CMUOH_MAKE_VECTOR_HPP_ #include <type_traits> #include <vector> namespace cmuoh::detail { template <typename T, typename...> -
outro56 revised this gist
Sep 15, 2020 . 2 changed files with 57 additions and 54 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,61 +1,12 @@ #ifndef CMUOH_MAKE_VECTOR_HPP_ #define CMUOH_MAKE_VECTOR_HPP_ #include <type_traits> #include <vector> #include "make_vector_details.hpp" namespace cmuoh { template <typename T = void, typename... Args, typename V = detail::vec_type_helper_t<T, Args...>, @@ -66,4 +17,6 @@ std::vector<V> make_vector(Args&&... args) return detail::make_vector_impl<V>(std::forward<Args>(args)...); } } // namespace "cmuoh" #endif //CMUOH_MAKE_VECTOR_HPP_ This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,50 @@ #ifdefine CMUOH_MAKE_VECTOR_HPP_ namespace cmuoh::detail { template <typename T, typename...> struct vec_type_helper { using type = T; }; template <typename... Args> struct vec_type_helper<void, Args...> { using type = typename std::common_type<Args...>::type; }; template <typename T, typename... Args> using vec_type_helper_t = typename vec_type_helper<T, Args...>::type; template <typename, typename...> struct all_constructible_and_convertible : std::true_type {}; template <typename T, typename First, typename... Rest> struct all_constructible_and_convertible<T, First, Rest...> : std::conditional< std::is_constructible<T, First>::value && std::is_convertible<First, T>::value, all_constructible_and_convertible<T, Rest...>, std::false_type>::type {}; template <typename T, typename... Args, typename std::enable_if< !std::is_trivially_copyable<T>::value, int>::type = 0> std::vector<T> make_vector_impl(Args&&... args) { std::vector<T> vec; vec.reserve(sizeof...(Args)); using arr_t = int[]; (void) arr_t{0, (vec.emplace_back(std::forward<Args>(args)), 0)...}; return vec; } template <typename T, typename... Args, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0> std::vector<T> make_vector_impl(Args&&... args) { return std::vector<T>{std::forward<Args>(args)...}; } } // namespace "cmuoh::details" #endif -
tcbrindle revised this gist
Feb 9, 2019 . 1 changed file with 22 additions and 8 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -24,7 +24,7 @@ struct vec_type_helper<void, Args...> { template <typename T, typename... Args> using vec_type_helper_t = typename vec_type_helper<T, Args...>::type; template <typename, typename...> struct all_constructible_and_convertible : std::true_type {}; @@ -36,7 +36,25 @@ struct all_constructible_and_convertible<T, First, Rest...> all_constructible_and_convertible<T, Rest...>, std::false_type>::type {}; template <typename T, typename... Args, typename std::enable_if< !std::is_trivially_copyable<T>::value, int>::type = 0> std::vector<T> make_vector_impl(Args&&... args) { std::vector<T> vec; vec.reserve(sizeof...(Args)); using arr_t = int[]; (void) arr_t{0, (vec.emplace_back(std::forward<Args>(args)), 0)...}; return vec; } template <typename T, typename... Args, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0> std::vector<T> make_vector_impl(Args&&... args) { return std::vector<T>{std::forward<Args>(args)...}; } } // namespace detail template <typename T = void, typename... Args, @@ -45,11 +63,7 @@ template <typename T = void, typename... Args, detail::all_constructible_and_convertible<V, Args...>::value, int>::type = 0> std::vector<V> make_vector(Args&&... args) { return detail::make_vector_impl<V>(std::forward<Args>(args)...); } } // namespace tcb -
tcbrindle created this gist
Feb 8, 2019 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,55 @@ // make_vector.hpp // // Copyright (c) 2019 Tristan Brindle (tcbrindle at gmail dot com) // Distributed under the Boost Software License, Version 1.0. (See // http://www.boost.org/LICENSE_1_0.txt) #include <type_traits> #include <vector> namespace tcb { namespace detail { template <typename T, typename...> struct vec_type_helper { using type = T; }; template <typename... Args> struct vec_type_helper<void, Args...> { using type = typename std::common_type<Args...>::type; }; template <typename T, typename... Args> using vec_type_helper_t = typename vec_type_helper<T, Args...>::type; template <typename T, typename...> struct all_constructible_and_convertible : std::true_type {}; template <typename T, typename First, typename... Rest> struct all_constructible_and_convertible<T, First, Rest...> : std::conditional< std::is_constructible<T, First>::value && std::is_convertible<First, T>::value, all_constructible_and_convertible<T, Rest...>, std::false_type>::type {}; } // nemspace detail template <typename T = void, typename... Args, typename V = detail::vec_type_helper_t<T, Args...>, typename std::enable_if< detail::all_constructible_and_convertible<V, Args...>::value, int>::type = 0> std::vector<V> make_vector(Args&&... args) { std::vector<V> vec; vec.reserve(sizeof...(Args)); using arr_t = int[]; (void) arr_t{0, (vec.emplace_back(std::forward<Args>(args)), 0)...}; return vec; } }