1
0
forked from boostorg/mp11

Add an offset parameter to mp_from_sequence

This commit is contained in:
Peter Dimov
2023-05-14 03:39:39 +03:00
parent 773ec9b8b2
commit b7da04c594
3 changed files with 51 additions and 5 deletions

View File

@@ -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 }>;
// mp_from_sequence<S>
// mp_from_sequence<S, F>
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
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>
template<std::size_t N> using mp_iota_c = mp_from_sequence<make_index_sequence<N>>;

View File

@@ -109,6 +109,7 @@ run mp_erase.cpp ;
run mp_with_index.cpp ;
run mp_with_index_cx.cpp ;
run mp_from_sequence.cpp ;
run mp_from_sequence_2.cpp ;
run mp_min_element.cpp ;
run mp_min_element_q.cpp ;
run mp_max_element.cpp ;

View 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();
}