多次元 vector の作成 (utility/make/pre17/vector.cpp)
- category: utility/make/pre17
-
View this file on GitHub
- Last commit date: 2020-04-05 15:19:11+09:00
Code
/**
* @brief 多次元 vector の作成
* @author えびちゃん
*/
#ifndef H_make_vector
#define H_make_vector
#include <cstddef>
#include <type_traits>
#include <vector>
namespace detail {
template <typename Tp, size_t N>
std::vector<Tp> make_vector(
std::vector<size_t>& sizes,
typename std::enable_if<(N == 1), Tp const&>::type x
) {
return std::vector<Tp>(sizes[0], x);
}
template <typename Tp, size_t N>
auto make_vector(
std::vector<size_t>& sizes,
typename std::enable_if<(N > 1), Tp const&>::type x
) {
size_t size = sizes[N-1];
sizes.pop_back();
return std::vector<decltype(make_vector<Tp, N-1>(sizes, x))>(
size, make_vector<Tp, N-1>(sizes, x)
);
}
} // detail::
template <typename Tp, size_t N>
auto make_vector(size_t const(&sizes)[N], Tp const& x = Tp()) {
std::vector<size_t> s(N);
for (size_t i = 0; i < N; ++i) s[i] = sizes[N-i-1];
return detail::make_vector<Tp, N>(s, x);
}
#endif /* !defined(H_make_vector) */
#line 1 "utility/make/pre17/vector.cpp"
/**
* @brief 多次元 vector の作成
* @author えびちゃん
*/
#ifndef H_make_vector
#define H_make_vector
#include <cstddef>
#include <type_traits>
#include <vector>
namespace detail {
template <typename Tp, size_t N>
std::vector<Tp> make_vector(
std::vector<size_t>& sizes,
typename std::enable_if<(N == 1), Tp const&>::type x
) {
return std::vector<Tp>(sizes[0], x);
}
template <typename Tp, size_t N>
auto make_vector(
std::vector<size_t>& sizes,
typename std::enable_if<(N > 1), Tp const&>::type x
) {
size_t size = sizes[N-1];
sizes.pop_back();
return std::vector<decltype(make_vector<Tp, N-1>(sizes, x))>(
size, make_vector<Tp, N-1>(sizes, x)
);
}
} // detail::
template <typename Tp, size_t N>
auto make_vector(size_t const(&sizes)[N], Tp const& x = Tp()) {
std::vector<size_t> s(N);
for (size_t i = 0; i < N; ++i) s[i] = sizes[N-i-1];
return detail::make_vector<Tp, N>(s, x);
}
#endif /* !defined(H_make_vector) */