make_array 仕様変更

make_common_array 追加
This commit is contained in:
bolero-MURAKAMI 2011-10-30 14:48:10 +09:00
parent cf64e4c457
commit 9a229b824f
2 changed files with 19 additions and 7 deletions

View file

@ -11,6 +11,7 @@
#include <sprout/fixed_container/traits.hpp> #include <sprout/fixed_container/traits.hpp>
#include <sprout/fixed_container/functions.hpp> #include <sprout/fixed_container/functions.hpp>
#include <sprout/iterator.hpp> #include <sprout/iterator.hpp>
#include <sprout/utility/forward.hpp>
#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL #include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT_DETAIL
#if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION #if SPROUT_USE_INDEX_ITERATOR_IMPLEMENTATION
# include <sprout/iterator/index_iterator.hpp> # include <sprout/iterator/index_iterator.hpp>
@ -245,13 +246,17 @@ namespace sprout {
// //
// make_array // make_array
// //
template<typename T, typename... Tail> template<typename T, typename... Types>
SPROUT_CONSTEXPR inline sprout::array<T, 1 + sizeof...(Tail)> make_array(T const& head, Tail const&... tail) { SPROUT_CONSTEXPR inline sprout::array<T, sizeof...(Types)> make_array(Types&&... args) {
return sprout::array<T, 1 + sizeof...(Tail)>{{head, tail...}}; return sprout::array<typename std::decay<T>::type, sizeof...(Types)>{{sprout::forward<Types>(args)...}};
} }
template<typename T>
SPROUT_CONSTEXPR inline sprout::array<T, 0> make_array() { //
return sprout::array<T, 0>{}; // make_common_array
//
template<typename... Types>
SPROUT_CONSTEXPR inline sprout::array<typename std::common_type<typename std::decay<Types>::type...>::type, sizeof...(Types)> make_common_array(Types&&... args) {
return sprout::array<typename std::common_type<typename std::decay<Types>::type...>::type, sizeof...(Types)>{{sprout::forward<Types>(args)...}};
} }
namespace detail { namespace detail {

View file

@ -629,11 +629,18 @@ namespace sprout {
SPROUT_CONSTEXPR typename sprout::math::detail::factorials<long double>::table_type sprout::math::detail::factorials<long double>::table; SPROUT_CONSTEXPR typename sprout::math::detail::factorials<long double>::table_type sprout::math::detail::factorials<long double>::table;
} // namespace detail } // namespace detail
// //
// factorial_limit
//
template<typename T>
SPROUT_CONSTEXPR std::size_t factorial_limit() {
return sprout::math::detail::factorials<T>::limit;
}
//
// factorial // factorial
// //
template<typename T> template<typename T>
SPROUT_CONSTEXPR T factorial(std::size_t x) { SPROUT_CONSTEXPR T factorial(std::size_t x) {
return x <= sprout::math::detail::factorials<T>::limit return x <= sprout::math::factorial_limit<T>()
? sprout::math::detail::factorials<T>::table[x] ? sprout::math::detail::factorials<T>::table[x]
: throw std::invalid_argument("factorial(): argument limit exceeded") : throw std::invalid_argument("factorial(): argument limit exceeded")
; ;