Skip to content

Instantly share code, notes, and snippets.

@outro56
Forked from tcbrindle/make_vector.hpp
Last active September 15, 2020 21:30
Show Gist options
  • Select an option

  • Save outro56/5e48dfc6c61f0ffc5191c1cf6189a6c6 to your computer and use it in GitHub Desktop.

Select an option

Save outro56/5e48dfc6c61f0ffc5191c1cf6189a6c6 to your computer and use it in GitHub Desktop.

Revisions

  1. outro56 revised this gist Sep 15, 2020. 2 changed files with 3 additions and 3 deletions.
    3 changes: 0 additions & 3 deletions make_vector.hpp
    Original file line number Diff line number Diff line change
    @@ -1,9 +1,6 @@
    #ifndef CMUOH_MAKE_VECTOR_HPP_
    #define CMUOH_MAKE_VECTOR_HPP_

    #include <type_traits>
    #include <vector>

    #include "make_vector_details.hpp"

    namespace cmuoh {
    3 changes: 3 additions & 0 deletions make_vector_details.hpp
    Original 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...>
  2. outro56 revised this gist Sep 15, 2020. 2 changed files with 57 additions and 54 deletions.
    61 changes: 7 additions & 54 deletions make_vector.hpp
    Original file line number Diff line number Diff line change
    @@ -1,61 +1,12 @@
    // 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)
    #ifndef CMUOH_MAKE_VECTOR_HPP_
    #define CMUOH_MAKE_VECTOR_HPP_

    #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, 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 detail
    #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 tcb
    } // namespace "cmuoh"

    #endif //CMUOH_MAKE_VECTOR_HPP_
    50 changes: 50 additions & 0 deletions make_vector_details.hpp
    Original 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
  3. @tcbrindle tcbrindle revised this gist Feb 9, 2019. 1 changed file with 22 additions and 8 deletions.
    30 changes: 22 additions & 8 deletions make_vector.hpp
    Original 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 T, typename...>
    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 {};

    } // nemspace detail
    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)
    {
    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;
    return detail::make_vector_impl<V>(std::forward<Args>(args)...);
    }

    }
    } // namespace tcb
  4. @tcbrindle tcbrindle created this gist Feb 8, 2019.
    55 changes: 55 additions & 0 deletions make_vector.hpp
    Original 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;
    }

    }