forked from boostorg/mp11
Add an offset parameter to mp_from_sequence
This commit is contained in:
@@ -308,20 +308,20 @@ template<class L, std::size_t N> using mp_drop_c = typename detail::mp_drop_impl
|
|||||||
|
|
||||||
template<class L, class N> using mp_drop = mp_drop_c<L, std::size_t{ N::value }>;
|
template<class L, class N> using mp_drop = mp_drop_c<L, std::size_t{ N::value }>;
|
||||||
|
|
||||||
// mp_from_sequence<S>
|
// mp_from_sequence<S, F>
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<class S> struct mp_from_sequence_impl;
|
template<class S, class F> struct mp_from_sequence_impl;
|
||||||
|
|
||||||
template<template<class T, T... I> class S, class U, U... J> struct mp_from_sequence_impl<S<U, J...>>
|
template<template<class T, T... I> class S, class U, U... J, class F> struct mp_from_sequence_impl<S<U, J...>, F>
|
||||||
{
|
{
|
||||||
using type = mp_list<std::integral_constant<U, J>...>;
|
using type = mp_list_c<U, (F::value + J)...>;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template<class S> using mp_from_sequence = typename detail::mp_from_sequence_impl<S>::type;
|
template<class S, class F = mp_int<0>> using mp_from_sequence = typename detail::mp_from_sequence_impl<S, F>::type;
|
||||||
|
|
||||||
// mp_iota(_c)<N>
|
// mp_iota(_c)<N>
|
||||||
template<std::size_t N> using mp_iota_c = mp_from_sequence<make_index_sequence<N>>;
|
template<std::size_t N> using mp_iota_c = mp_from_sequence<make_index_sequence<N>>;
|
||||||
|
@@ -109,6 +109,7 @@ run mp_erase.cpp ;
|
|||||||
run mp_with_index.cpp ;
|
run mp_with_index.cpp ;
|
||||||
run mp_with_index_cx.cpp ;
|
run mp_with_index_cx.cpp ;
|
||||||
run mp_from_sequence.cpp ;
|
run mp_from_sequence.cpp ;
|
||||||
|
run mp_from_sequence_2.cpp ;
|
||||||
run mp_min_element.cpp ;
|
run mp_min_element.cpp ;
|
||||||
run mp_min_element_q.cpp ;
|
run mp_min_element_q.cpp ;
|
||||||
run mp_max_element.cpp ;
|
run mp_max_element.cpp ;
|
||||||
|
45
test/mp_from_sequence_2.cpp
Normal file
45
test/mp_from_sequence_2.cpp
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
// Copyright 2017, 2023 Peter Dimov.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// https://www.boost.org/LICENSE_1_0.txt
|
||||||
|
|
||||||
|
#include <boost/mp11/algorithm.hpp>
|
||||||
|
#include <boost/mp11/integral.hpp>
|
||||||
|
#include <boost/mp11/integer_sequence.hpp>
|
||||||
|
#include <boost/core/lightweight_test_trait.hpp>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
template<class T, T... I> struct S;
|
||||||
|
|
||||||
|
template<char Ch> using mp_char = std::integral_constant<char, Ch>;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
using boost::mp11::mp_list;
|
||||||
|
using boost::mp11::mp_list_c;
|
||||||
|
using boost::mp11::mp_from_sequence;
|
||||||
|
using boost::mp11::mp_int;
|
||||||
|
using boost::mp11::mp_size_t;
|
||||||
|
using boost::mp11::make_integer_sequence;
|
||||||
|
using boost::mp11::make_index_sequence;
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<S<int>, mp_int<-3>>, mp_list<>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<S<int, 1>, mp_int<-3>>, mp_list<mp_int<-2>>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<S<int, 1, 3>, mp_int<-3>>, mp_list<mp_int<-2>, mp_int<0>>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<S<int, 1, 3, 5>, mp_int<-3>>, mp_list<mp_int<-2>, mp_int<0>, mp_int<+2>>>));
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<S<char, 0, 3, 7>, mp_int<'0'>>, mp_list_c<char, '0', '3', '7'>>));
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_integer_sequence<int, 0>, mp_int<-3>>, mp_list<>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_integer_sequence<int, 1>, mp_int<-3>>, mp_list<mp_int<-3>>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_integer_sequence<int, 2>, mp_int<-3>>, mp_list<mp_int<-3>, mp_int<-2>>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_integer_sequence<int, 3>, mp_int<-3>>, mp_list<mp_int<-3>, mp_int<-2>, mp_int<-1>>>));
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_integer_sequence<char, 5>, mp_size_t<'0'>>, mp_list_c<char, '0', '1', '2', '3', '4'>>));
|
||||||
|
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_index_sequence<0>, mp_int<4>>, mp_list<>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_index_sequence<1>, mp_int<4>>, mp_list<mp_size_t<4>>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_index_sequence<2>, mp_int<4>>, mp_list<mp_size_t<4>, mp_size_t<5>>>));
|
||||||
|
BOOST_TEST_TRAIT_TRUE((std::is_same<mp_from_sequence<make_index_sequence<3>, mp_int<4>>, mp_list<mp_size_t<4>, mp_size_t<5>, mp_size_t<6>>>));
|
||||||
|
|
||||||
|
return boost::report_errors();
|
||||||
|
}
|
Reference in New Issue
Block a user