From 25aaea01360a6f7d436baf2eefb07dec38c5b49c Mon Sep 17 00:00:00 2001 From: Edward Diener Date: Wed, 10 Jun 2020 09:59:30 -0400 Subject: [PATCH] Updated arithmetic. --- include/boost/preprocessor/arithmetic/div.hpp | 15 +++---------- include/boost/preprocessor/arithmetic/mod.hpp | 21 +++---------------- include/boost/preprocessor/arithmetic/mul.hpp | 16 ++++++++++---- test/arithmetic.cxx | 2 ++ 4 files changed, 20 insertions(+), 34 deletions(-) diff --git a/include/boost/preprocessor/arithmetic/div.hpp b/include/boost/preprocessor/arithmetic/div.hpp index bfb1bd4..8a8f0f7 100644 --- a/include/boost/preprocessor/arithmetic/div.hpp +++ b/include/boost/preprocessor/arithmetic/div.hpp @@ -18,18 +18,12 @@ # include # include # include -# include -# include +# include # include -# include -# include # # /* BOOST_PP_DIV */ # -# define BOOST_PP_DIV(x, y) \ - BOOST_PP_IIF(BOOST_PP_BITAND(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_COMPL(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(y))),BOOST_PP_IDENTITY_N(x,2),BOOST_PP_DIV_CHECK_MAX)(x,y) -# -# define BOOST_PP_DIV_CHECK_MAX(x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(y),BOOST_PP_IDENTITY_N(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(x),2),BOOST_PP_DIV_DO)(x,y) +# define BOOST_PP_DIV(x, y) BOOST_PP_IIF(BOOST_PP_IS_1(y),BOOST_PP_IDENTITY_N(x,2),BOOST_PP_DIV_DO)(x,y) # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() # define BOOST_PP_DIV_DO(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE(x, y)) @@ -40,10 +34,7 @@ # # /* BOOST_PP_DIV_D */ # -# define BOOST_PP_DIV_D(d, x, y) \ - BOOST_PP_IIF(BOOST_PP_BITAND(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_COMPL(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(y))),BOOST_PP_IDENTITY_N(x,3),BOOST_PP_DIV_CHECK_MAX_D)(d,x,y) -# -# define BOOST_PP_DIV_CHECK_MAX_D(d, x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(y),BOOST_PP_IDENTITY_N(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(x),3),BOOST_PP_DIV_DO_D)(d,x,y) +# define BOOST_PP_DIV_D(d, x, y) BOOST_PP_IIF(BOOST_PP_IS_1(y),BOOST_PP_IDENTITY_N(x,3),BOOST_PP_DIV_DO_D)(d,x,y) # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() # define BOOST_PP_DIV_DO_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE_D(d, x, y)) diff --git a/include/boost/preprocessor/arithmetic/mod.hpp b/include/boost/preprocessor/arithmetic/mod.hpp index 96b0835..54c8924 100644 --- a/include/boost/preprocessor/arithmetic/mod.hpp +++ b/include/boost/preprocessor/arithmetic/mod.hpp @@ -18,21 +18,12 @@ # include # include # include -# include -# include +# include # include -# include -# include # # /* BOOST_PP_MOD */ # -# define BOOST_PP_MOD(x, y) \ - BOOST_PP_IIF(BOOST_PP_BITAND(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_COMPL(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(y))), \ - BOOST_PP_IDENTITY_N(x,2),BOOST_PP_MOD_CHECKMAX)(x,y) -# -# define BOOST_PP_MOD_CHECKMAX(x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(y),BOOST_PP_MOD_CHECK_OTHER_MAX,BOOST_PP_MOD_DO)(x,y) -# -# define BOOST_PP_MOD_CHECK_OTHER_MAX(x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(x),0,x) +# define BOOST_PP_MOD(x, y) BOOST_PP_IIF(BOOST_PP_IS_1(y),BOOST_PP_IDENTITY_N(0,2),BOOST_PP_MOD_DO)(x,y) # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() # define BOOST_PP_MOD_DO(x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE(x, y)) @@ -43,13 +34,7 @@ # # /* BOOST_PP_MOD_D */ # -# define BOOST_PP_MOD_D(d, x, y) \ - BOOST_PP_IIF(BOOST_PP_BITAND(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_COMPL(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(y))), \ - BOOST_PP_IDENTITY_N(x,3),BOOST_PP_MOD_CHECKMAX_D)(d,x,y) -# -# define BOOST_PP_MOD_CHECKMAX_D(d, x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(y),BOOST_PP_MOD_CHECK_OTHER_MAX_D,BOOST_PP_MOD_DO_D)(d,x,y) -# -# define BOOST_PP_MOD_CHECK_OTHER_MAX_D(d, x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(x),0,x) +# define BOOST_PP_MOD_D(d, x, y) BOOST_PP_IIF(BOOST_PP_IS_1(y),BOOST_PP_IDENTITY_N(0,3),BOOST_PP_MOD_DO_D)(d,x,y) # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() # define BOOST_PP_MOD_DO_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE_D(d, x, y)) diff --git a/include/boost/preprocessor/arithmetic/mul.hpp b/include/boost/preprocessor/arithmetic/mul.hpp index 7f4859b..9adead5 100644 --- a/include/boost/preprocessor/arithmetic/mul.hpp +++ b/include/boost/preprocessor/arithmetic/mul.hpp @@ -20,7 +20,9 @@ # include # include # include +# include # include +# include # include # include # include @@ -30,9 +32,12 @@ # # /* BOOST_PP_MUL */ # -# define BOOST_PP_MUL(x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_IDENTITY_N(x,2),BOOST_PP_MUL_CHECK_MAX)(x,y) +# define BOOST_PP_MUL(x, y) \ + BOOST_PP_IIF(BOOST_PP_BITOR(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(y)),BOOST_PP_IDENTITY_N(0,2),BOOST_PP_MUL_CHECK_1X)(x,y) # -# define BOOST_PP_MUL_CHECK_MAX(x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(y),BOOST_PP_IDENTITY_N(y,2),BOOST_PP_MUL_DO)(x,y) +# define BOOST_PP_MUL_CHECK_1X(x, y) BOOST_PP_IIF(BOOST_PP_IS_1(x),BOOST_PP_IDENTITY_N(y,2),BOOST_PP_MUL_CHECK_1Y)(x,y) +# +# define BOOST_PP_MUL_CHECK_1Y(x, y) BOOST_PP_IIF(BOOST_PP_IS_1(y),BOOST_PP_IDENTITY_N(x,2),BOOST_PP_MUL_DO)(x,y) # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() # define BOOST_PP_MUL_DO(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y))) @@ -54,9 +59,12 @@ # # /* BOOST_PP_MUL_D */ # -# define BOOST_PP_MUL_D(d, x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_IDENTITY_N(x,3),BOOST_PP_MUL_CHECK_MAX_D)(d,x,y) +# define BOOST_PP_MUL_D(d, x, y) \ + BOOST_PP_IIF(BOOST_PP_BITOR(BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(x),BOOST_PP_DETAIL_IS_MINIMUM_NUMBER(y)),BOOST_PP_IDENTITY_N(0,3),BOOST_PP_MUL_CHECK_1X_D)(d,x,y) # -# define BOOST_PP_MUL_CHECK_MAX_D(d, x, y) BOOST_PP_IIF(BOOST_PP_DETAIL_IS_MAXIMUM_NUMBER(y),BOOST_PP_IDENTITY_N(y,3),BOOST_PP_MUL_DO_D)(d,x,y) +# define BOOST_PP_MUL_CHECK_1X_D(d, x, y) BOOST_PP_IIF(BOOST_PP_IS_1(x),BOOST_PP_IDENTITY_N(y,3),BOOST_PP_MUL_CHECK_1Y)(d,x,y) +# +# define BOOST_PP_MUL_CHECK_1Y_D(d, x, y) BOOST_PP_IIF(BOOST_PP_IS_1(y),BOOST_PP_IDENTITY_N(x,3),BOOST_PP_MUL_DO_D)(d,x,y) # # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() # define BOOST_PP_MUL_DO_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y))) diff --git a/test/arithmetic.cxx b/test/arithmetic.cxx index b3718c2..65116fd 100644 --- a/test/arithmetic.cxx +++ b/test/arithmetic.cxx @@ -103,6 +103,7 @@ BEGIN BOOST_PP_MUL(BOOST_PP_LIMIT_MAG, 2) == BOOST_PP_LIMIT_MAG END BEGIN BOOST_PP_MUL(2, 255) == 256 END BEGIN BOOST_PP_MUL(255, 2) == 256 END BEGIN BOOST_PP_MUL(17, 17) == 256 END +BEGIN BOOST_PP_MUL(1, 255) == 255 END #endif @@ -120,6 +121,7 @@ BEGIN BOOST_PP_MUL(BOOST_PP_MUL(5, 5), BOOST_PP_MUL(4, 4)) == 400 END BEGIN BOOST_PP_MUL(2, 511) == 512 END BEGIN BOOST_PP_MUL(511, 2) == 512 END BEGIN BOOST_PP_MUL(24, 24) == 512 END +BEGIN BOOST_PP_MUL(1, 511) == 511 END #endif