From db212400607006217c1ea3fc644155e708195fc3 Mon Sep 17 00:00:00 2001 From: Edward Diener Date: Sun, 5 Jul 2020 13:13:06 -0400 Subject: [PATCH] Split reverse for seq seize greater than 256 --- include/boost/preprocessor/seq/reverse.hpp | 45 +++++++++++++++------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/include/boost/preprocessor/seq/reverse.hpp b/include/boost/preprocessor/seq/reverse.hpp index 13c5ff1..be30ba3 100644 --- a/include/boost/preprocessor/seq/reverse.hpp +++ b/include/boost/preprocessor/seq/reverse.hpp @@ -22,19 +22,28 @@ # include # include # include +# include # # /* BOOST_PP_SEQ_REVERSE */ # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() -# define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_REVERSE_HALVES(BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) -# define BOOST_PP_SEQ_REVERSE_HALVES(half,seq) \ - BOOST_PP_IF(half,BOOST_PP_SEQ_REVERSE_NAMT,BOOST_PP_IDENTITY_N(seq,2))(half,seq) -# define BOOST_PP_SEQ_REVERSE_NAMT(half,seq) \ - BOOST_PP_SEQ_DO_REVERSE(BOOST_PP_SEQ_REST_N(half,seq)) BOOST_PP_SEQ_DO_REVERSE(BOOST_PP_SEQ_FIRST_N(half,seq)) -# define BOOST_PP_SEQ_DO_REVERSE(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# if BOOST_PP_LIMIT_SEQ == 256 +# define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# else +# define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_REVERSE_HALVES(BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) +# define BOOST_PP_SEQ_REVERSE_HALVES(half,seq) \ + BOOST_PP_IF(half,BOOST_PP_SEQ_REVERSE_NAMT,BOOST_PP_IDENTITY_N(seq,2))(half,seq) +# define BOOST_PP_SEQ_REVERSE_NAMT(half,seq) \ + BOOST_PP_SEQ_DO_REVERSE(BOOST_PP_SEQ_REST_N(half,seq)) BOOST_PP_SEQ_DO_REVERSE(BOOST_PP_SEQ_FIRST_N(half,seq)) +# define BOOST_PP_SEQ_DO_REVERSE(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# endif # else # define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_REVERSE_I(seq) -# define BOOST_PP_SEQ_REVERSE_I(seq) BOOST_PP_SEQ_REVERSE_HALVES(BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) +# if BOOST_PP_LIMIT_SEQ == 256 +# define BOOST_PP_SEQ_REVERSE_I(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# else +# define BOOST_PP_SEQ_REVERSE_I(seq) BOOST_PP_SEQ_REVERSE_HALVES(BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) +# endif # endif # # define BOOST_PP_SEQ_REVERSE_O(s, state, elem) (elem) state @@ -42,15 +51,23 @@ # /* BOOST_PP_SEQ_REVERSE_S */ # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() -# define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_REVERSE_HALVES_S(s,BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) -# define BOOST_PP_SEQ_REVERSE_HALVES_S(s,half,seq) \ - BOOST_PP_IF(half,BOOST_PP_SEQ_REVERSE_NAMT_S,BOOST_PP_IDENTITY_N(seq,3))(s,half,seq) -# define BOOST_PP_SEQ_REVERSE_NAMT_S(s,half,seq) \ - BOOST_PP_SEQ_DO_REVERSE_S(s,BOOST_PP_SEQ_REST_N(half,seq)) BOOST_PP_SEQ_DO_REVERSE_S(s,BOOST_PP_SEQ_FIRST_N(half,seq)) -# define BOOST_PP_SEQ_DO_REVERSE_S(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# if BOOST_PP_LIMIT_SEQ == 256 +# define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# else +# define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_REVERSE_HALVES_S(s,BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) +# define BOOST_PP_SEQ_REVERSE_HALVES_S(s,half,seq) \ + BOOST_PP_IF(half,BOOST_PP_SEQ_REVERSE_NAMT_S,BOOST_PP_IDENTITY_N(seq,3))(s,half,seq) +# define BOOST_PP_SEQ_REVERSE_NAMT_S(s,half,seq) \ + BOOST_PP_SEQ_DO_REVERSE_S(s,BOOST_PP_SEQ_REST_N(half,seq)) BOOST_PP_SEQ_DO_REVERSE_S(s,BOOST_PP_SEQ_FIRST_N(half,seq)) +# define BOOST_PP_SEQ_DO_REVERSE_S(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# endif # else # define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_REVERSE_S_I(s, seq) -# define BOOST_PP_SEQ_REVERSE_S_I(s, seq) BOOST_PP_SEQ_REVERSE_HALVES_S(s,BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) +# if BOOST_PP_LIMIT_SEQ == 256 +# define BOOST_PP_SEQ_REVERSE_S_I(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)() +# else +# define BOOST_PP_SEQ_REVERSE_S_I(s, seq) BOOST_PP_SEQ_REVERSE_HALVES_S(s,BOOST_PP_DIV(BOOST_PP_SEQ_SIZE(seq),2),seq) +# endif # endif # # endif