diff --git a/doc/headers.html b/doc/headers.html
index 90b59fd..e96b25e 100644
--- a/doc/headers.html
+++ b/doc/headers.html
@@ -138,8 +138,10 @@
punctuation/
comma.hpp
comma_if.hpp
+ is_begin_parens.hpp (v)
paren.hpp
paren_if.hpp
+ remove_parens.hpp (v)
repeat.hpp*
repeat_2nd.hpp*
repeat_3rd.hpp*
diff --git a/doc/headers/punctuation/is_begin_parens.html b/doc/headers/punctuation/is_begin_parens.html
new file mode 100644
index 0000000..4897623
--- /dev/null
+++ b/doc/headers/punctuation/is_begin_parens.html
@@ -0,0 +1,26 @@
+
+
+
+ punctuation/is_begin_parens.hpp
+
+
+
+ The punctuation/is_begin_parens.hpp
+ header defines a macro that determines if variadic data begins with a
+ parenthesis.
+ Usage
+ #include <boost/preprocessor/punctuation/is_begin_parens.hpp>
+
+ Contents
+
+
+ © Copyright Edward Diener 2014
+
+
+
diff --git a/doc/headers/punctuation/remove_parens.html b/doc/headers/punctuation/remove_parens.html
new file mode 100644
index 0000000..f2b6e46
--- /dev/null
+++ b/doc/headers/punctuation/remove_parens.html
@@ -0,0 +1,26 @@
+
+
+
+ punctuation/remove_parens.hpp
+
+
+
+ The punctuation/remove_parens.hpp
+ header defines a macro that removes the beginning parenthesis from its
+ input if it exists.
+ Usage
+ #include <boost/preprocessor/punctuation/remove_parens.hpp>
+
+ Contents
+
+
+ © Copyright Edward Diener 2014
+
+
+
diff --git a/doc/ref.html b/doc/ref.html
index 82c2905..4d2081f 100644
--- a/doc/ref.html
+++ b/doc/ref.html
@@ -105,6 +105,7 @@
INCLUDE_SELF
INDIRECT_SELF
INTERCEPT
+ IS_BEGIN_PARENS (v)
IS_ITERATING
IS_SELFISH
ITERATE
@@ -209,6 +210,7 @@
RELATIVE_FLAGS
RELATIVE_ITERATION
RELATIVE_START
+ REMOVE_PARENS (v)
REPEAT
REPEAT_1ST*
REPEAT_2ND*
diff --git a/doc/ref/array_to_list.html b/doc/ref/array_to_list.html
index 607b205..2fdd247 100644
--- a/doc/ref/array_to_list.html
+++ b/doc/ref/array_to_list.html
@@ -1,33 +1,41 @@
-
- BOOST_PP_ARRAY_TO_LIST
-
-
-
- The BOOST_PP_ARRAY_TO_LIST
-macro converts an array to a list .
-Usage
- BOOST_PP_ARRAY_TO_LIST (array )
-
-Arguments
-array
- The array to be converted.
-
-
-Requirements
-
-Sample Code
-
-
- © Copyright Edward Diener 2011
-
-
+
+
+ BOOST_PP_ARRAY_TO_LIST
+
+
+
+ The BOOST_PP_ARRAY_TO_LIST macro
+ converts an array to a list .
+ Usage
+ BOOST_PP_ARRAY_TO_LIST (array )
+ Arguments
+
+ array
+ The array to be converted.
+
+
+ Remarks
+ If the array to be converted is empty, as
+ represented by '( 0, () )', the resulting list is empty, as
+ represented by 'BOOST_PP_NIL'.
+ Requirements
+
+ Sample Code
+
+
+ © Copyright Edward Diener 2011
+
+ s
+
diff --git a/doc/ref/array_to_seq.html b/doc/ref/array_to_seq.html
index 308b364..bf3518e 100644
--- a/doc/ref/array_to_seq.html
+++ b/doc/ref/array_to_seq.html
@@ -1,31 +1,37 @@
-
- BOOST_PP_ARRAY_TO_SEQ
-
-
-
- The BOOST_PP_ARRAY_TO_SEQ macro
-converts an array to a seq .
- Usage
- BOOST_PP_ARRAY_TO_SEQ (array )
-
- Arguments
-array
- The array to be converted.
-
- Requirements
-
- Sample Code
-
-
- © Copyright Edward Diener 2011
-
-
+
+
+ BOOST_PP_ARRAY_TO_SEQ
+
+
+
+ The BOOST_PP_ARRAY_TO_SEQ macro
+ converts an array to a seq .
+ Usage
+ BOOST_PP_ARRAY_TO_SEQ (array )
+ Arguments
+
+ array
+ The array to be converted.
+
+ Remarks
+ If the array to be converted is empty, as
+ represented by '( 0, () )', the resulting seq is undefined since a
+ seq cannot be empty.
+ Requirements
+
+ Sample Code
+
+
+ © Copyright Edward Diener 2011
+
+
diff --git a/doc/ref/array_to_tuple.html b/doc/ref/array_to_tuple.html
index 085dd39..8f9c958 100644
--- a/doc/ref/array_to_tuple.html
+++ b/doc/ref/array_to_tuple.html
@@ -1,31 +1,39 @@
-
- BOOST_PP_ARRAY_TO_TUPLE
-
-
-
- The BOOST_PP_ARRAY_TO_TUPLE macro
-converts an array to an tuple .
- Usage
- BOOST_PP_ARRAY_TO_TUPLE (array )
- Arguments
-
- array
- The array to be converted.
-
- Requirements
-
- Sample Code
-
-
- © Copyright Edward Diener 2011
-
-
+
+
+ BOOST_PP_ARRAY_TO_TUPLE
+
+
+
+ The BOOST_PP_ARRAY_TO_TUPLE macro
+ converts an array to an tuple .
+ Usage
+ BOOST_PP_ARRAY_TO_TUPLE (array )
+ Arguments
+
+ array
+ The array to be converted.
+
+ Remarks
+ If the array to be converted is empty, as
+ represented by '( 0, () )', the resulting tuple is undefined
+ since a tuple cannot be empty.
+ Requirements
+
+ Sample Code
+
+
+ © Copyright Edward Diener 2011
+
+
+
diff --git a/doc/ref/is_begin_parens.html b/doc/ref/is_begin_parens.html
new file mode 100644
index 0000000..0e0b39c
--- /dev/null
+++ b/doc/ref/is_begin_parens.html
@@ -0,0 +1,47 @@
+
+
+
+ BOOST_PP_IS_BEGIN_PARENS
+
+
+
+ The BOOST_PP_IS_BEGIN_PAREN S
+ determines whether the input starts with a set of parenthesis.
+ Usage
+ BOOST_PP_IS_BEGIN_PARENS (...)
(v)
+ Arguments
+ ...
+ The input as variadic data.
+ Remarks
+ If the input input begins with a parenthesis, with any data within
+ that parenthesis, the macro returns 1, otherwise it returns 0. Data may
+ follow the beginning parenthesis and the macro still will return 1.
+
+ For Visual Studio 2005 ( VC8 ) the input data must be a single parameter
+ else a compilation error will occur.
+ See Also
+
+ Requirements
+
+ Sample Code
+
+
#include <boost/preprocessor/punctuation/is_begin_parens.hpp >
+
+#define VARDATA more_data , more_params #define VARDATAP ( data ) more_data , more_params #define DATA data #define DATAP ( data ) more_data
+BOOST_PP_IS_BEGIN_PARENS(VARDATA) // expands to 0, compiler error with VC8
+BOOST_PP_IS_BEGIN_PARENS(VARDATAP) // expands to 1, compiler error with VC8 BOOST_PP_IS_BEGIN_PARENS(DATA) // expands to 0
+BOOST_PP_IS_BEGIN_PARENS(DATAP) // expands to 1 BOOST_PP_IS_BEGIN_PARENS() // expands to 0
+
+
+ © Copyright Edward Diener 2014
+
+
+
diff --git a/doc/ref/list_to_array.html b/doc/ref/list_to_array.html
index b691b34..46154c9 100644
--- a/doc/ref/list_to_array.html
+++ b/doc/ref/list_to_array.html
@@ -1,39 +1,47 @@
-
- BOOST_PP_LIST_TO_ARRAY
-
-
- The BOOST_PP_LIST_TO_ARRAY macro
-converts a list to an array .
- Usage
- BOOST_PP_LIST_TO_ARRAY (list )
- Arguments
-
- list
- The list to be converted.
-
-Remarks
-
- This macro uses BOOST_PP_WHILE .
- Within BOOST_PP_WHILE , it is more efficient to use BOOST_PP_LIST_TO_ARRAY_D .
-
-See Also
-
- Requirements
-
- Sample Code
-
-
- © Copyright Edward Diener 2011
-
-
+
+
+ BOOST_PP_LIST_TO_ARRAY
+
+
+
+ The BOOST_PP_LIST_TO_ARRAY macro
+ converts a list to an array .
+ Usage
+ BOOST_PP_LIST_TO_ARRAY (list )
+ Arguments
+
+ list
+ The list to be converted.
+
+
+ Remarks
+ This macro uses BOOST_PP_WHILE . Within BOOST_PP_WHILE ,
+ it is more efficient to use BOOST_PP_LIST_TO_ARRAY_D .
+
+ If the list to be converted is empty, as represented by
+ 'BOOST_PP_NIL', the resulting array is empty, as represented by '( 0, ()
+ )'.
+ See Also
+
+ Requirements
+
+ Sample Code
+
+
+ © Copyright Edward Diener 2011
+
+
+
diff --git a/doc/ref/list_to_array_d.html b/doc/ref/list_to_array_d.html
index 8d93328..835d9e2 100644
--- a/doc/ref/list_to_array_d.html
+++ b/doc/ref/list_to_array_d.html
@@ -1,27 +1,34 @@
-
- BOOST_PP_LIST_TO_ARRAY_D
-
-
-
-The BOOST_PP_LIST_TO_ARRAY_D macro converts a list to an array .
-It reenters BOOST_PP_WHILE with maximum efficiency.
-
- Usage
- BOOST_PP_LIST_TO_ARRAY_D (d , list )
- Arguments
-
- d
- The next available BOOST_PP_WHILE iteration.
- list
- The list to be converted.
-
-See Also
-
- Requirements
-
-
+
+
+ BOOST_PP_LIST_TO_ARRAY_D
+
+
+
+ The BOOST_PP_LIST_TO_ARRAY_D macro
+ converts a list to an array . It reenters BOOST_PP_WHILE
+ with maximum efficiency.
+ Usage
+ BOOST_PP_LIST_TO_ARRAY_D (d , list )
+
+ Arguments
+
+ d
+ The next available BOOST_PP_WHILE iteration.
+ list
+ The list to be converted.
+
+ Remarks
+ If the list to be converted is empty, as
+ represented by 'BOOST_PP_NIL', the resulting array is empty, as
+ represented by '( 0, () )'.
+ See Also
+ See Also
+
+ Requirements
+
+
diff --git a/doc/ref/list_to_seq.html b/doc/ref/list_to_seq.html
index 2f77cf1..3efc7e1 100644
--- a/doc/ref/list_to_seq.html
+++ b/doc/ref/list_to_seq.html
@@ -1,40 +1,44 @@
-
- BOOST_PP_LIST_TO_SEQ
-
-
-
- The BOOST_PP_LIST_TO_SEQ macro
-converts a list to a seq .
- Usage
- BOOST_PP_LIST_TO_SEQ (list )
-
- Arguments
-list
- The list to be converted.
-
-Remarks
-
- This macro uses BOOST_PP_FOR .
- Within BOOST_PP_FOR , it is more efficient to use BOOST_PP_LIST_TO_SEQ_R .
-
-See Also
-
- Requirements
-
- Sample Code
-
-
- © Copyright Edward Diener 2011
-
-
+
+
+ BOOST_PP_LIST_TO_SEQ
+
+
+
+ The BOOST_PP_LIST_TO_SEQ macro
+ converts a list to a seq .
+ Usage
+ BOOST_PP_LIST_TO_SEQ (list )
+ Arguments
+
+ list
+ The list to be converted.
+
+ Remarks
+ This macro uses BOOST_PP_FOR . Within BOOST_PP_FOR , it
+ is more efficient to use BOOST_PP_LIST_TO_SEQ_R .
+
+ If the list to be converted is empty, as represented by
+ 'BOOST_PP_NIL', the resulting seq is undefined since a seq
+ cannot be empty.
+ See Also
+
+ Requirements
+
+ Sample Code
+
+
+ © Copyright Edward Diener 2011
+
+
diff --git a/doc/ref/list_to_seq_r.html b/doc/ref/list_to_seq_r.html
index 2c2bb37..cc7a854 100644
--- a/doc/ref/list_to_seq_r.html
+++ b/doc/ref/list_to_seq_r.html
@@ -1,27 +1,32 @@
-
- BOOST_PP_LIST_TO_SEQ_R
-
-
-
-The BOOST_PP_LIST_TO_SEQ_R macro converts a list to an seq .
-It reenters BOOST_PP_FOR with maximum efficiency.
-
- Usage
- BOOST_PP_LIST_TO_SEQ_R (r , list )
- Arguments
-
- d
- The next available BOOST_PP_FOR repetition.
- list
- The list to be converted.
-
-See Also
-
- Requirements
-
-
+
+
+ BOOST_PP_LIST_TO_SEQ_R
+
+
+
+ The BOOST_PP_LIST_TO_SEQ_R macro
+ converts a list to a seq . It reenters BOOST_PP_FOR
+ with maximum efficiency.
+ Usage
+ BOOST_PP_LIST_TO_SEQ_R (r , list )
+ Arguments
+
+ d
+ The next available BOOST_PP_FOR repetition.
+ list
+ The list to be converted.
+
+ Remarks
+ If the list to be converted is empty, as
+ represented by 'BOOST_PP_NIL', the resulting seq is undefined
+ since a seq cannot be empty.
+ See Also
+
+ Requirements
+
+
diff --git a/doc/ref/list_to_tuple.html b/doc/ref/list_to_tuple.html
index 37e7311..d022c2b 100644
--- a/doc/ref/list_to_tuple.html
+++ b/doc/ref/list_to_tuple.html
@@ -1,62 +1,55 @@
-
- BOOST_PP_LIST_TO_TUPLE
-
-
-
-
- The BOOST_PP_LIST_TO_TUPLE macro converts a list to a tuple .
-
- Usage
-
- BOOST_PP_LIST_TO_TUPLE (list )
-
- Arguments
-
- list
-
- The list to be converted.
-
-
- Remarks
-
- If
list is, for example, (
a , (
b , (
c ,
BOOST_PP_NIL ))),
- this macro will produce:
-
- (a , b , c )
-
-
-
- Previously, this macro could not be used inside BOOST_PP_FOR .
- There is no longer any such restriction.
- It is more efficient, however, to use BOOST_PP_LIST_TO_TUPLE_R in such a situation.
-
- See Also
-
- Requirements
-
- Sample Code
-
-#include <boost/preprocessor/list/to_tuple.hpp >
+
+
+ BOOST_PP_LIST_TO_TUPLE
+
+
+
+ The BOOST_PP_LIST_TO_TUPLE macro
+ converts a list to a tuple .
+ Usage
+ BOOST_PP_LIST_TO_TUPLE (list )
+ Arguments
+
+ list
+ The list to be converted.
+
+
Remarks
+
If
list is, for example, (
a , (
b , (
c ,
BOOST_PP_NIL ))),
+ this macro will produce:
+
(a , b , c )
+
+
Previously, this macro could not be used inside BOOST_PP_FOR .
+ There is no longer any such restriction. It is more efficient,
+ however, to use BOOST_PP_LIST_TO_TUPLE_R in such a situation.
+
+ If the list to be converted is empty, as represented by 'BOOST_PP_NIL',
+ the resulting tuple is undefined since a tuple cannot be
+ empty.
+
See Also
+
+
Requirements
+
+
Sample Code
+
-
-
-
© Copyright Housemarque Oy 2002
-
© Copyright Paul Mensonides 2002
-
-
-
+
+
+
+
diff --git a/doc/ref/list_to_tuple_r.html b/doc/ref/list_to_tuple_r.html
index 1ba51a0..0227d38 100644
--- a/doc/ref/list_to_tuple_r.html
+++ b/doc/ref/list_to_tuple_r.html
@@ -1,47 +1,42 @@
-
-
BOOST_PP_LIST_TO_TUPLE_R
-
-
-
-
- The BOOST_PP_LIST_TO_TUPLE_R macro converts a list to a tuple .
- It reenters BOOST_PP_FOR with maximum efficiency.
-
-
Usage
-
- BOOST_PP_LIST_TO_TUPLE_R (r , list )
-
-
Arguments
-
- r
-
- The next available BOOST_PP_FOR repetition.
-
- list
-
- The list to be converted.
-
-
-
Remarks
-
- If
list is, for example, (
a , (
b , (
c ,
BOOST_PP_NIL ))),
- this macro will produce:
-
- (a , b , c )
-
-
-
See Also
-
-
Requirements
-
-
Sample Code
-
-#include <boost/preprocessor/list/adt.hpp >
+
+
+ BOOST_PP_LIST_TO_TUPLE_R
+
+
+
+ The BOOST_PP_LIST_TO_TUPLE_R macro
+ converts a list to a tuple . It reenters BOOST_PP_FOR
+ with maximum efficiency.
+ Usage
+ BOOST_PP_LIST_TO_TUPLE_R (r , list )
+
+ Arguments
+
+ r
+ The next available BOOST_PP_FOR repetition.
+ list
+ The list to be converted.
+
+
Remarks
+
If list is, for example, (a , (b , (c ,
+ BOOST_PP_NIL ))), this macro will produce:
+
+
If the list to
+ be converted is empty, as represented by 'BOOST_PP_NIL', the resulting tuple
+ is undefined since a tuple cannot be empty.
+
See Also
+
+
Requirements
+
+
Sample Code
+
-
-
-
© Copyright Housemarque Oy 2002
-
© Copyright Paul Mensonides 2002
-
-
-
+
+
+
+
diff --git a/doc/ref/remove_parens.html b/doc/ref/remove_parens.html
new file mode 100644
index 0000000..72312dd
--- /dev/null
+++ b/doc/ref/remove_parens.html
@@ -0,0 +1,44 @@
+
+
+
+
BOOST_PP_REMOVE_PARENS
+
+
+
+
The BOOST_PP_REMOVE_PAREN S macro
+ removes the beginning parenthesis, if it exists, from the input data and
+ expands to the result
+
Usage
+
BOOST_PP_REMOVE_PARENS (param)
(v)
+
Arguments
+
param
+
+ The input data.
+
Remarks
+
If the input begins with a parenthesis, with any data within that
+ parenthesis, the macro removes the parenthesis and expands to the result.
+ If the input does not begin with a parenthesis the macro expands to the
+ input.
+
+
See Also
+
+
Requirements
+
+
Sample Code
+
+
+
© Copyright Edward Diener 2014
+
+
+
diff --git a/include/boost/preprocessor/array/detail/get_data.hpp b/include/boost/preprocessor/array/detail/get_data.hpp
new file mode 100644
index 0000000..fafa498
--- /dev/null
+++ b/include/boost/preprocessor/array/detail/get_data.hpp
@@ -0,0 +1,50 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014. *
+# * Distributed under the Boost Software License, Version 1.0. (See *
+# * accompanying file LICENSE_1_0.txt or copy at *
+# * http://www.boost.org/LICENSE_1_0.txt) *
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP
+# define BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP
+#
+# include
+# include
+#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && _MSC_VER > 1400
+# include
+# include
+# include
+# include
+#
+# /* BOOST_PP_ARRAY_DETAIL_GET_DATA */
+#
+# define BOOST_PP_ARRAY_DETAIL_GET_DATA_SINGLE(size, data) BOOST_PP_TUPLE_REM_CAT(size) data
+# define BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY(size, data) BOOST_PP_TUPLE_REM(size) data
+# define BOOST_PP_ARRAY_DETAIL_GET_DATA_CHECK_ZERO(size, data) \
+ BOOST_PP_IF \
+ ( \
+ size, \
+ BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY, \
+ BOOST_PP_ARRAY_DETAIL_GET_DATA_SINGLE \
+ ) \
+ (size,data) \
+/**/
+# define BOOST_PP_ARRAY_DETAIL_GET_DATA(size, data) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_1(size), \
+ BOOST_PP_ARRAY_DETAIL_GET_DATA_SINGLE, \
+ BOOST_PP_ARRAY_DETAIL_GET_DATA_CHECK_ZERO \
+ ) \
+ (size,data) \
+/**/
+# else
+# define BOOST_PP_ARRAY_DETAIL_GET_DATA(size, data) BOOST_PP_TUPLE_REM(size) data
+# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && _MSC_VER > 1400 */
+#
+# endif /* BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP */
diff --git a/include/boost/preprocessor/array/push_back.hpp b/include/boost/preprocessor/array/push_back.hpp
index 6d98d8e..5dce9e0 100644
--- a/include/boost/preprocessor/array/push_back.hpp
+++ b/include/boost/preprocessor/array/push_back.hpp
@@ -1,6 +1,7 @@
# /* **************************************************************************
# * *
# * (C) Copyright Paul Mensonides 2002.
+# * (C) Copyright Edward Diener 2014.
# * Distributed under the Boost Software License, Version 1.0. (See
# * accompanying file LICENSE_1_0.txt or copy at
# * http://www.boost.org/LICENSE_1_0.txt)
@@ -18,6 +19,7 @@
# include
# include
# include
+# include
#
# /* BOOST_PP_ARRAY_PUSH_BACK */
#
@@ -28,6 +30,6 @@
# define BOOST_PP_ARRAY_PUSH_BACK_D(array, elem) BOOST_PP_ARRAY_PUSH_BACK_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
# endif
#
-# define BOOST_PP_ARRAY_PUSH_BACK_I(size, data, elem) (BOOST_PP_INC(size), (BOOST_PP_TUPLE_REM(size) data BOOST_PP_COMMA_IF(size) elem))
+# define BOOST_PP_ARRAY_PUSH_BACK_I(size, data, elem) (BOOST_PP_INC(size), (BOOST_PP_ARRAY_DETAIL_GET_DATA(size,data) BOOST_PP_COMMA_IF(size) elem))
#
# endif
diff --git a/include/boost/preprocessor/array/push_front.hpp b/include/boost/preprocessor/array/push_front.hpp
index 59344c3..a6c6dc7 100644
--- a/include/boost/preprocessor/array/push_front.hpp
+++ b/include/boost/preprocessor/array/push_front.hpp
@@ -1,6 +1,7 @@
# /* **************************************************************************
# * *
# * (C) Copyright Paul Mensonides 2002.
+# * (C) Copyright Edward Diener 2014.
# * Distributed under the Boost Software License, Version 1.0. (See
# * accompanying file LICENSE_1_0.txt or copy at
# * http://www.boost.org/LICENSE_1_0.txt)
@@ -18,6 +19,7 @@
# include
# include
# include
+# include
#
# /* BOOST_PP_ARRAY_PUSH_FRONT */
#
@@ -28,6 +30,6 @@
# define BOOST_PP_ARRAY_PUSH_FRONT_D(array, elem) BOOST_PP_ARRAY_PUSH_FRONT_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)
# endif
#
-# define BOOST_PP_ARRAY_PUSH_FRONT_I(size, data, elem) (BOOST_PP_INC(size), (elem BOOST_PP_COMMA_IF(size) BOOST_PP_TUPLE_REM(size) data))
+# define BOOST_PP_ARRAY_PUSH_FRONT_I(size, data, elem) (BOOST_PP_INC(size), (elem BOOST_PP_COMMA_IF(size) BOOST_PP_ARRAY_DETAIL_GET_DATA(size,data)))
#
# endif
diff --git a/include/boost/preprocessor/array/to_list.hpp b/include/boost/preprocessor/array/to_list.hpp
index 9198561..4cb45b6 100644
--- a/include/boost/preprocessor/array/to_list.hpp
+++ b/include/boost/preprocessor/array/to_list.hpp
@@ -15,19 +15,33 @@
#
# include
# include
+# include
+# include
# include
#
# /* BOOST_PP_ARRAY_TO_LIST */
#
+# define BOOST_PP_ARRAY_TO_LIST(array) \
+ BOOST_PP_IF \
+ ( \
+ BOOST_PP_ARRAY_SIZE(array), \
+ BOOST_PP_ARRAY_TO_LIST_DO, \
+ BOOST_PP_ARRAY_TO_LIST_EMPTY \
+ ) \
+ (array) \
+/**/
+#
+# define BOOST_PP_ARRAY_TO_LIST_EMPTY(array) BOOST_PP_NIL
+#
# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
-# define BOOST_PP_ARRAY_TO_LIST(array) BOOST_PP_ARRAY_TO_LIST_I(BOOST_PP_TUPLE_TO_LIST, array)
+# define BOOST_PP_ARRAY_TO_LIST_DO(array) BOOST_PP_ARRAY_TO_LIST_I(BOOST_PP_TUPLE_TO_LIST, array)
# define BOOST_PP_ARRAY_TO_LIST_I(m, args) BOOST_PP_ARRAY_TO_LIST_II(m, args)
# define BOOST_PP_ARRAY_TO_LIST_II(m, args) BOOST_PP_CAT(m ## args,)
# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
-# define BOOST_PP_ARRAY_TO_LIST(array) BOOST_PP_ARRAY_TO_LIST_I(array)
+# define BOOST_PP_ARRAY_TO_LIST_DO(array) BOOST_PP_ARRAY_TO_LIST_I(array)
# define BOOST_PP_ARRAY_TO_LIST_I(array) BOOST_PP_TUPLE_TO_LIST ## array
# else
-# define BOOST_PP_ARRAY_TO_LIST(array) BOOST_PP_TUPLE_TO_LIST array
+# define BOOST_PP_ARRAY_TO_LIST_DO(array) BOOST_PP_TUPLE_TO_LIST array
# endif
#
# endif
diff --git a/include/boost/preprocessor/array/to_seq.hpp b/include/boost/preprocessor/array/to_seq.hpp
index ebcae53..7303f34 100644
--- a/include/boost/preprocessor/array/to_seq.hpp
+++ b/include/boost/preprocessor/array/to_seq.hpp
@@ -15,19 +15,32 @@
#
# include
# include
+# include
+# include
# include
#
# /* BOOST_PP_ARRAY_TO_SEQ */
#
+# define BOOST_PP_ARRAY_TO_SEQ(array) \
+ BOOST_PP_IF \
+ ( \
+ BOOST_PP_ARRAY_SIZE(array), \
+ BOOST_PP_ARRAY_TO_SEQ_DO, \
+ BOOST_PP_ARRAY_TO_SEQ_EMPTY \
+ ) \
+ (array) \
+/**/
+# define BOOST_PP_ARRAY_TO_SEQ_EMPTY(array)
+#
# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
-# define BOOST_PP_ARRAY_TO_SEQ(array) BOOST_PP_ARRAY_TO_SEQ_I(BOOST_PP_TUPLE_TO_SEQ, array)
+# define BOOST_PP_ARRAY_TO_SEQ_DO(array) BOOST_PP_ARRAY_TO_SEQ_I(BOOST_PP_TUPLE_TO_SEQ, array)
# define BOOST_PP_ARRAY_TO_SEQ_I(m, args) BOOST_PP_ARRAY_TO_SEQ_II(m, args)
# define BOOST_PP_ARRAY_TO_SEQ_II(m, args) BOOST_PP_CAT(m ## args,)
# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
-# define BOOST_PP_ARRAY_TO_SEQ(array) BOOST_PP_ARRAY_TO_SEQ_I(array)
+# define BOOST_PP_ARRAY_TO_SEQ_DO(array) BOOST_PP_ARRAY_TO_SEQ_I(array)
# define BOOST_PP_ARRAY_TO_SEQ_I(array) BOOST_PP_TUPLE_TO_SEQ ## array
# else
-# define BOOST_PP_ARRAY_TO_SEQ(array) BOOST_PP_TUPLE_TO_SEQ array
+# define BOOST_PP_ARRAY_TO_SEQ_DO(array) BOOST_PP_TUPLE_TO_SEQ array
# endif
#
# endif
diff --git a/include/boost/preprocessor/array/to_tuple.hpp b/include/boost/preprocessor/array/to_tuple.hpp
index eb83274..0d8defa 100644
--- a/include/boost/preprocessor/array/to_tuple.hpp
+++ b/include/boost/preprocessor/array/to_tuple.hpp
@@ -14,9 +14,20 @@
# define BOOST_PREPROCESSOR_ARRAY_TO_TUPLE_HPP
#
# include
+# include
+# include
#
# /* BOOST_PP_ARRAY_TO_TUPLE */
#
-# define BOOST_PP_ARRAY_TO_TUPLE BOOST_PP_ARRAY_DATA
+# define BOOST_PP_ARRAY_TO_TUPLE(array) \
+ BOOST_PP_IF \
+ ( \
+ BOOST_PP_ARRAY_SIZE(array), \
+ BOOST_PP_ARRAY_DATA, \
+ BOOST_PP_ARRAY_TO_TUPLE_EMPTY \
+ ) \
+ (array) \
+/**/
+# define BOOST_PP_ARRAY_TO_TUPLE_EMPTY(array)
#
# endif
diff --git a/include/boost/preprocessor/facilities/detail/is_empty.hpp b/include/boost/preprocessor/facilities/detail/is_empty.hpp
new file mode 100644
index 0000000..e044970
--- /dev/null
+++ b/include/boost/preprocessor/facilities/detail/is_empty.hpp
@@ -0,0 +1,55 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+#ifndef BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP
+#define BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP
+
+#include
+
+#if BOOST_PP_VARIADICS_MSVC
+
+# pragma warning(once:4002)
+
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, b) b
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, b) t
+
+#else
+
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, ...) __VA_ARGS__
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, ...) t
+
+#endif
+
+#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400
+
+#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(param) \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C param () \
+ ) \
+/**/
+
+#else
+
+#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(...) \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \
+ ) \
+/**/
+
+#endif
+
+#define BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(a, b) a ## b
+#define BOOST_PP_DETAIL_IS_EMPTY_IIF(bit) BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(BOOST_PP_DETAIL_IS_EMPTY_IIF_,bit)
+#define BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C(...) ()
+
+#endif /* BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP */
diff --git a/include/boost/preprocessor/facilities/empty.hpp b/include/boost/preprocessor/facilities/empty.hpp
index 46db190..6f215dc 100644
--- a/include/boost/preprocessor/facilities/empty.hpp
+++ b/include/boost/preprocessor/facilities/empty.hpp
@@ -14,6 +14,8 @@
# ifndef BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP
# define BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP
#
+# include
+#
# /* BOOST_PP_EMPTY */
#
# define BOOST_PP_EMPTY()
diff --git a/include/boost/preprocessor/facilities/is_empty.hpp b/include/boost/preprocessor/facilities/is_empty.hpp
index 638265c..d0403a9 100644
--- a/include/boost/preprocessor/facilities/is_empty.hpp
+++ b/include/boost/preprocessor/facilities/is_empty.hpp
@@ -1,6 +1,7 @@
# /* **************************************************************************
# * *
# * (C) Copyright Paul Mensonides 2003.
+# * (C) Copyright Edward Diener 2014.
# * Distributed under the Boost Software License, Version 1.0. (See
# * accompanying file LICENSE_1_0.txt or copy at
# * http://www.boost.org/LICENSE_1_0.txt)
@@ -13,17 +14,28 @@
# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP
#
# include
-# include
+#
+# if BOOST_PP_VARIADICS
+#
+# include
+#
+# else
+#
+# include
+# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
# include
-# include
+# include
+# else
+# include
# include
+# endif
#
# /* BOOST_PP_IS_EMPTY */
#
# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
# define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I(x BOOST_PP_IS_EMPTY_HELPER)
# define BOOST_PP_IS_EMPTY_I(contents) BOOST_PP_TUPLE_ELEM(2, 1, (BOOST_PP_IS_EMPTY_DEF_ ## contents()))
-# define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 1, 1 BOOST_PP_EMPTY
+# define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 1, BOOST_PP_IDENTITY(1)
# define BOOST_PP_IS_EMPTY_HELPER() , 0
# else
# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
@@ -40,4 +52,6 @@
# define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 0, BOOST_PP_NIL
# endif
#
-# endif
+# endif /* BOOST_PP_VARIADICS */
+#
+# endif /* BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP */
diff --git a/include/boost/preprocessor/facilities/is_empty_or_1.hpp b/include/boost/preprocessor/facilities/is_empty_or_1.hpp
index baa5da9..815666f 100644
--- a/include/boost/preprocessor/facilities/is_empty_or_1.hpp
+++ b/include/boost/preprocessor/facilities/is_empty_or_1.hpp
@@ -14,6 +14,7 @@
#
# include
# include
+# include
# include
# include
#
@@ -22,7 +23,7 @@
# define BOOST_PP_IS_EMPTY_OR_1(x) \
BOOST_PP_IIF( \
BOOST_PP_IS_EMPTY(x BOOST_PP_EMPTY()), \
- 1 BOOST_PP_EMPTY, \
+ BOOST_PP_IDENTITY(1), \
BOOST_PP_IS_1 \
)(x) \
/**/
diff --git a/include/boost/preprocessor/facilities/is_empty_variadic.hpp b/include/boost/preprocessor/facilities/is_empty_variadic.hpp
new file mode 100644
index 0000000..eee4062
--- /dev/null
+++ b/include/boost/preprocessor/facilities/is_empty_variadic.hpp
@@ -0,0 +1,57 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP
+# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP
+#
+# include
+#
+# if BOOST_PP_VARIADICS
+#
+# include
+# include
+#
+#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400
+#
+#define BOOST_PP_IS_EMPTY(param) \
+ BOOST_PP_DETAIL_IS_EMPTY_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ param \
+ ) \
+ ) \
+ ( \
+ BOOST_PP_IS_EMPTY_ZERO, \
+ BOOST_PP_DETAIL_IS_EMPTY_PROCESS \
+ ) \
+ (param) \
+/**/
+#define BOOST_PP_IS_EMPTY_ZERO(param) 0
+# else
+#define BOOST_PP_IS_EMPTY(...) \
+ BOOST_PP_DETAIL_IS_EMPTY_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS \
+ ( \
+ __VA_ARGS__ \
+ ) \
+ ) \
+ ( \
+ BOOST_PP_IS_EMPTY_ZERO, \
+ BOOST_PP_DETAIL_IS_EMPTY_PROCESS \
+ ) \
+ (__VA_ARGS__) \
+/**/
+#define BOOST_PP_IS_EMPTY_ZERO(...) 0
+# endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */
+# endif /* BOOST_PP_VARIADICS */
+# endif /* BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP */
diff --git a/include/boost/preprocessor/list/to_array.hpp b/include/boost/preprocessor/list/to_array.hpp
index 83f8a63..bd44d68 100644
--- a/include/boost/preprocessor/list/to_array.hpp
+++ b/include/boost/preprocessor/list/to_array.hpp
@@ -1,6 +1,7 @@
# /* **************************************************************************
# * *
-# * (C) Copyright Edward Diener 2011.
+# * (C) Copyright Paul Mensonides 2011.
+# * (C) Copyright Edward Diener 2011,2014.
# * Distributed under the Boost Software License, Version 1.0. (See
# * accompanying file LICENSE_1_0.txt or copy at
# * http://www.boost.org/LICENSE_1_0.txt)
@@ -19,10 +20,28 @@
# include
# include
# include
+# include
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && (_MSC_VER <= 1400)
+# include
+# endif
#
# /* BOOST_PP_LIST_TO_ARRAY */
#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && (_MSC_VER <= 1400)
+# define BOOST_PP_LIST_TO_ARRAY(list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_LIST_IS_NIL(list), \
+ BOOST_PP_LIST_TO_ARRAY_VC8ORLESS_EMPTY, \
+ BOOST_PP_LIST_TO_ARRAY_VC8ORLESS_DO \
+ ) \
+ (list) \
+/**/
+# define BOOST_PP_LIST_TO_ARRAY_VC8ORLESS_EMPTY(list) (0,())
+# define BOOST_PP_LIST_TO_ARRAY_VC8ORLESS_DO(list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE, list)
+# else
# define BOOST_PP_LIST_TO_ARRAY(list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE, list)
+# endif
# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
# define BOOST_PP_LIST_TO_ARRAY_I(w, list) \
@@ -114,10 +133,24 @@
# endif
# define BOOST_PP_LIST_TO_ARRAY_P(d, state) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(3, 0, state))
# define BOOST_PP_LIST_TO_ARRAY_O(d, state) BOOST_PP_LIST_TO_ARRAY_O_I state
-# define BOOST_PP_LIST_TO_ARRAY_O_I(list, size, tuple) (BOOST_PP_LIST_REST(list), BOOST_PP_INC(size), (BOOST_PP_TUPLE_REM(size) tuple, BOOST_PP_LIST_FIRST(list)))
+# define BOOST_PP_LIST_TO_ARRAY_O_I(list, size, tuple) (BOOST_PP_LIST_REST(list), BOOST_PP_INC(size), (BOOST_PP_ARRAY_DETAIL_GET_DATA(size,tuple), BOOST_PP_LIST_FIRST(list)))
#
# /* BOOST_PP_LIST_TO_ARRAY_D */
#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && (_MSC_VER <= 1400)
+# define BOOST_PP_LIST_TO_ARRAY_D(d, list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_LIST_IS_NIL(list), \
+ BOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_EMPTY, \
+ BOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_DO \
+ ) \
+ (d, list) \
+/**/
+# define BOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_EMPTY(d, list) (0,())
+# define BOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_DO(d, list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE_ ## d, list)
+# else
# define BOOST_PP_LIST_TO_ARRAY_D(d, list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE_ ## d, list)
+# endif
#
# endif /* BOOST_PREPROCESSOR_LIST_TO_ARRAY_HPP */
diff --git a/include/boost/preprocessor/list/to_tuple.hpp b/include/boost/preprocessor/list/to_tuple.hpp
index 557de36..c7b3da8 100644
--- a/include/boost/preprocessor/list/to_tuple.hpp
+++ b/include/boost/preprocessor/list/to_tuple.hpp
@@ -16,22 +16,45 @@
#
# include
# include
+# include
#
# /* BOOST_PP_LIST_TO_TUPLE */
#
+# define BOOST_PP_LIST_TO_TUPLE(list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_LIST_IS_NIL(list), \
+ BOOST_PP_LIST_TO_TUPLE_EMPTY, \
+ BOOST_PP_LIST_TO_TUPLE_DO \
+ ) \
+ (list) \
+/**/
+# define BOOST_PP_LIST_TO_TUPLE_EMPTY(list)
+#
# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
-# define BOOST_PP_LIST_TO_TUPLE(list) (BOOST_PP_LIST_ENUM(list))
+# define BOOST_PP_LIST_TO_TUPLE_DO(list) (BOOST_PP_LIST_ENUM(list))
# else
-# define BOOST_PP_LIST_TO_TUPLE(list) BOOST_PP_LIST_TO_TUPLE_I(list)
+# define BOOST_PP_LIST_TO_TUPLE_DO(list) BOOST_PP_LIST_TO_TUPLE_I(list)
# define BOOST_PP_LIST_TO_TUPLE_I(list) (BOOST_PP_LIST_ENUM(list))
# endif
#
# /* BOOST_PP_LIST_TO_TUPLE_R */
#
+# define BOOST_PP_LIST_TO_TUPLE_R(r, list) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_LIST_IS_NIL(list), \
+ BOOST_PP_LIST_TO_TUPLE_R_EMPTY, \
+ BOOST_PP_LIST_TO_TUPLE_R_DO \
+ ) \
+ (r, list) \
+/**/
+# define BOOST_PP_LIST_TO_TUPLE_R_EMPTY(r,list)
+#
# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
-# define BOOST_PP_LIST_TO_TUPLE_R(r, list) (BOOST_PP_LIST_ENUM_R(r, list))
+# define BOOST_PP_LIST_TO_TUPLE_R_DO(r, list) (BOOST_PP_LIST_ENUM_R(r, list))
# else
-# define BOOST_PP_LIST_TO_TUPLE_R(r, list) BOOST_PP_LIST_TO_TUPLE_R_I(r, list)
+# define BOOST_PP_LIST_TO_TUPLE_R_DO(r, list) BOOST_PP_LIST_TO_TUPLE_R_I(r, list)
# define BOOST_PP_LIST_TO_TUPLE_R_I(r, list) (BOOST_PP_LIST_ENUM_R(r, list))
# endif
#
diff --git a/include/boost/preprocessor/punctuation.hpp b/include/boost/preprocessor/punctuation.hpp
index 72da73e..56dd064 100644
--- a/include/boost/preprocessor/punctuation.hpp
+++ b/include/boost/preprocessor/punctuation.hpp
@@ -14,7 +14,9 @@
#
# include
# include
+# include
# include
# include
+# include
#
# endif
diff --git a/include/boost/preprocessor/punctuation/detail/is_begin_parens.hpp b/include/boost/preprocessor/punctuation/detail/is_begin_parens.hpp
new file mode 100644
index 0000000..c94ccf3
--- /dev/null
+++ b/include/boost/preprocessor/punctuation/detail/is_begin_parens.hpp
@@ -0,0 +1,48 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+#ifndef BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP
+#define BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP
+
+#if BOOST_PP_VARIADICS_MSVC
+
+#include
+
+#define BOOST_PP_DETAIL_VD_IBP_CAT(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b)
+#define BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_II(a ## b)
+#define BOOST_PP_DETAIL_VD_IBP_CAT_II(res) res
+
+#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \
+ BOOST_PP_DETAIL_VD_IBP_CAT(BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__),BOOST_PP_EMPTY()) \
+/**/
+
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1 1
+
+#else
+
+#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \
+ BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__) \
+/**/
+
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1
+
+#endif /* BOOST_PP_VARIADICS_MSVC */
+
+#define BOOST_PP_DETAIL_IBP_SPLIT_0(a, ...) a
+#define BOOST_PP_DETAIL_IBP_SPLIT_1(a, ...) __VA_ARGS__
+
+#define BOOST_PP_DETAIL_IBP_CAT(a, ...) BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a,__VA_ARGS__)
+#define BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
+
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_1 1,
+#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_BOOST_PP_DETAIL_IBP_IS_VARIADIC_C 0,
+
+#endif /* BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP */
diff --git a/include/boost/preprocessor/punctuation/is_begin_parens.hpp b/include/boost/preprocessor/punctuation/is_begin_parens.hpp
new file mode 100644
index 0000000..20b32bc
--- /dev/null
+++ b/include/boost/preprocessor/punctuation/is_begin_parens.hpp
@@ -0,0 +1,51 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP
+# define BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP
+
+# include
+
+#if BOOST_PP_VARIADICS
+
+#include
+
+#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400
+
+#define BOOST_PP_IS_BEGIN_PARENS(param) \
+ BOOST_PP_DETAIL_IBP_SPLIT \
+ ( \
+ 0, \
+ BOOST_PP_DETAIL_IBP_CAT \
+ ( \
+ BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \
+ BOOST_PP_DETAIL_IBP_IS_VARIADIC_C param \
+ ) \
+ ) \
+/**/
+
+#else
+
+#define BOOST_PP_IS_BEGIN_PARENS(...) \
+ BOOST_PP_DETAIL_IBP_SPLIT \
+ ( \
+ 0, \
+ BOOST_PP_DETAIL_IBP_CAT \
+ ( \
+ BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \
+ BOOST_PP_DETAIL_IBP_IS_VARIADIC_C __VA_ARGS__ \
+ ) \
+ ) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP */
diff --git a/include/boost/preprocessor/punctuation/remove_parens.hpp b/include/boost/preprocessor/punctuation/remove_parens.hpp
new file mode 100644
index 0000000..4700936
--- /dev/null
+++ b/include/boost/preprocessor/punctuation/remove_parens.hpp
@@ -0,0 +1,39 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+#ifndef BOOST_PREPROCESSOR_REMOVE_PARENS_HPP
+#define BOOST_PREPROCESSOR_REMOVE_PARENS_HPP
+
+#include
+
+#if BOOST_PP_VARIADICS
+
+#include
+#include
+#include
+#include
+
+#define BOOST_PP_REMOVE_PARENS(param) \
+ BOOST_PP_IIF \
+ ( \
+ BOOST_PP_IS_BEGIN_PARENS(param), \
+ BOOST_PP_REMOVE_PARENS_DO, \
+ BOOST_PP_IDENTITY \
+ ) \
+ (param)() \
+/**/
+
+#define BOOST_PP_REMOVE_PARENS_DO(param) \
+ BOOST_PP_IDENTITY(BOOST_PP_TUPLE_ENUM(param)) \
+/**/
+
+#endif /* BOOST_PP_VARIADICS */
+#endif /* BOOST_PREPROCESSOR_REMOVE_PARENS_HPP */
diff --git a/include/boost/preprocessor/seq/detail/binary_transform.hpp b/include/boost/preprocessor/seq/detail/binary_transform.hpp
index 373e8a5..1c381a7 100644
--- a/include/boost/preprocessor/seq/detail/binary_transform.hpp
+++ b/include/boost/preprocessor/seq/detail/binary_transform.hpp
@@ -16,6 +16,9 @@
# include
# include
# include
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
+# include
+# endif
#
# /* BOOST_PP_SEQ_BINARY_TRANSFORM */
#
@@ -28,8 +31,15 @@
# define BOOST_PP_SEQ_BINARY_TRANSFORM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)
# endif
# if BOOST_PP_VARIADICS
-# define BOOST_PP_SEQ_BINARY_TRANSFORM_A(...) (BOOST_PP_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_B
-# define BOOST_PP_SEQ_BINARY_TRANSFORM_B(...) (BOOST_PP_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_A
+# if BOOST_PP_VARIADICS_MSVC
+# define BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(...) \
+ BOOST_PP_VARIADIC_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,__VA_ARGS__) \
+ /**/
+# else
+# define BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(...) BOOST_PP_REM
+# endif
+# define BOOST_PP_SEQ_BINARY_TRANSFORM_A(...) (BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(__VA_ARGS__), __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_B
+# define BOOST_PP_SEQ_BINARY_TRANSFORM_B(...) (BOOST_PP_SEQ_BINARY_TRANSFORM_GET_REM(__VA_ARGS__), __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_A
# else
# define BOOST_PP_SEQ_BINARY_TRANSFORM_A(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_B
# define BOOST_PP_SEQ_BINARY_TRANSFORM_B(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_A
diff --git a/include/boost/preprocessor/seq/rest_n.hpp b/include/boost/preprocessor/seq/rest_n.hpp
index 7e589cc..6423376 100644
--- a/include/boost/preprocessor/seq/rest_n.hpp
+++ b/include/boost/preprocessor/seq/rest_n.hpp
@@ -14,17 +14,17 @@
#
# include
# include
-# include
+# include
# include
# include
#
# /* BOOST_PP_SEQ_REST_N */
#
# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
-# define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), (nil) seq BOOST_PP_EMPTY))()
+# define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), BOOST_PP_IDENTITY( (nil) seq )))()
# else
# define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_SEQ_REST_N_I(n, seq)
-# define BOOST_PP_SEQ_REST_N_I(n, seq) BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), (nil) seq BOOST_PP_EMPTY))()
+# define BOOST_PP_SEQ_REST_N_I(n, seq) BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), BOOST_PP_IDENTITY( (nil) seq )))()
# endif
#
# endif
diff --git a/include/boost/preprocessor/tuple/detail/is_single_return.hpp b/include/boost/preprocessor/tuple/detail/is_single_return.hpp
new file mode 100644
index 0000000..9ffa3cc
--- /dev/null
+++ b/include/boost/preprocessor/tuple/detail/is_single_return.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014. *
+# * Distributed under the Boost Software License, Version 1.0. (See *
+# * accompanying file LICENSE_1_0.txt or copy at *
+# * http://www.boost.org/LICENSE_1_0.txt) *
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP
+# define BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP
+#
+# include
+# include
+# include
+# include
+#
+# /* BOOST_PP_TUPLE_IS_SINGLE_RETURN */
+#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
+# define BOOST_PP_TUPLE_IS_SINGLE_RETURN(sr,nsr,tuple) \
+ BOOST_PP_IIF(BOOST_PP_IS_1(BOOST_PP_TUPLE_SIZE(tuple)),sr,nsr) \
+ /**/
+# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC */
+#
+# endif /* BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP */
diff --git a/include/boost/preprocessor/tuple/elem.hpp b/include/boost/preprocessor/tuple/elem.hpp
index 3eba1c5..ee8f0bd 100644
--- a/include/boost/preprocessor/tuple/elem.hpp
+++ b/include/boost/preprocessor/tuple/elem.hpp
@@ -8,7 +8,7 @@
# */
#
# /* Revised by Paul Mensonides (2002-2011) */
-# /* Revised by Edward Diener (2011) */
+# /* Revised by Edward Diener (2011,2014) */
#
# /* See http://www.boost.org for most recent version. */
#
@@ -21,15 +21,27 @@
# include
# include
#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
+# include
+# endif
+#
# if BOOST_PP_VARIADICS
# if BOOST_PP_VARIADICS_MSVC
# define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__), (__VA_ARGS__))
# define BOOST_PP_TUPLE_ELEM_I(m, args) BOOST_PP_TUPLE_ELEM_II(m, args)
# define BOOST_PP_TUPLE_ELEM_II(m, args) BOOST_PP_CAT(m ## args,)
+/*
+ Use BOOST_PP_REM_CAT if it is a single element tuple ( which might be empty )
+ else use BOOST_PP_REM. This fixes a VC++ problem with an empty tuple and BOOST_PP_TUPLE_ELEM
+ functionality. See tuple_elem_bug_test.cxx.
+*/
+# define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) \
+ BOOST_PP_VARIADIC_ELEM(n, BOOST_PP_TUPLE_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,tuple) tuple) \
+ /**/
# else
# define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__)(__VA_ARGS__)
+# define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) BOOST_PP_VARIADIC_ELEM(n, BOOST_PP_REM tuple)
# endif
-# define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) BOOST_PP_VARIADIC_ELEM(n, BOOST_PP_REM tuple)
# define BOOST_PP_TUPLE_ELEM_O_3(size, n, tuple) BOOST_PP_TUPLE_ELEM_O_2(n, tuple)
# else
# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
diff --git a/include/boost/preprocessor/tuple/rem.hpp b/include/boost/preprocessor/tuple/rem.hpp
index 270c31a..78e47fe 100644
--- a/include/boost/preprocessor/tuple/rem.hpp
+++ b/include/boost/preprocessor/tuple/rem.hpp
@@ -16,10 +16,17 @@
# include
# include
# include
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
+# include
+# endif
#
# /* BOOST_PP_REM */
#
# if BOOST_PP_VARIADICS
+# if BOOST_PP_VARIADICS_MSVC
+ /* To be used internally when __VA_ARGS__ is a single element */
+# define BOOST_PP_REM_CAT(...) BOOST_PP_CAT(__VA_ARGS__,)
+# endif
# define BOOST_PP_REM(...) __VA_ARGS__
# else
# define BOOST_PP_REM(x) x
@@ -30,7 +37,11 @@
/*
VC++8.0 cannot handle the variadic version of BOOST_PP_TUPLE_REM(size)
*/
-# if BOOST_PP_VARIADICS && !(BOOST_PP_VARIADICS_MSVC && _MSC_VER == 1400)
+# if BOOST_PP_VARIADICS && !(BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400)
+# if BOOST_PP_VARIADICS_MSVC
+ /* To be used internally when the size is 1 */
+# define BOOST_PP_TUPLE_REM_CAT(size) BOOST_PP_REM_CAT
+# endif
# define BOOST_PP_TUPLE_REM(size) BOOST_PP_REM
# else
# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()
@@ -114,10 +125,11 @@
# define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__), (__VA_ARGS__))
# define BOOST_PP_TUPLE_REM_CTOR_I(m, args) BOOST_PP_TUPLE_REM_CTOR_II(m, args)
# define BOOST_PP_TUPLE_REM_CTOR_II(m, args) BOOST_PP_CAT(m ## args,)
+# define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_TUPLE_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,tuple) tuple
# else
# define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__)(__VA_ARGS__)
+# define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_REM tuple
# endif
-# define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_REM tuple
# define BOOST_PP_TUPLE_REM_CTOR_O_2(size, tuple) BOOST_PP_TUPLE_REM_CTOR_O_1(tuple)
# else
# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
diff --git a/include/boost/preprocessor/tuple/to_seq.hpp b/include/boost/preprocessor/tuple/to_seq.hpp
index 8bd8485..a53f5a0 100644
--- a/include/boost/preprocessor/tuple/to_seq.hpp
+++ b/include/boost/preprocessor/tuple/to_seq.hpp
@@ -48,6 +48,9 @@
# endif
# endif
#
+/* An empty array can be passed */
+# define BOOST_PP_TUPLE_TO_SEQ_0() ()
+#
# define BOOST_PP_TUPLE_TO_SEQ_1(e0) (e0)
# define BOOST_PP_TUPLE_TO_SEQ_2(e0, e1) (e0)(e1)
# define BOOST_PP_TUPLE_TO_SEQ_3(e0, e1, e2) (e0)(e1)(e2)
diff --git a/include/boost/preprocessor/variadic/detail/is_single_return.hpp b/include/boost/preprocessor/variadic/detail/is_single_return.hpp
new file mode 100644
index 0000000..491e06b
--- /dev/null
+++ b/include/boost/preprocessor/variadic/detail/is_single_return.hpp
@@ -0,0 +1,28 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014. *
+# * Distributed under the Boost Software License, Version 1.0. (See *
+# * accompanying file LICENSE_1_0.txt or copy at *
+# * http://www.boost.org/LICENSE_1_0.txt) *
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# ifndef BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP
+# define BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP
+#
+# include
+# include
+# include
+# include
+#
+# /* BOOST_PP_VARIADIC_IS_SINGLE_RETURN */
+#
+# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC
+# define BOOST_PP_VARIADIC_IS_SINGLE_RETURN(sr,nsr,...) \
+ BOOST_PP_IIF(BOOST_PP_IS_1(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)),sr,nsr) \
+ /**/
+# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC */
+#
+# endif /* BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP */
diff --git a/test/Jamfile.v2 b/test/Jamfile.v2
index 92d1716..5e91c86 100644
--- a/test/Jamfile.v2
+++ b/test/Jamfile.v2
@@ -19,21 +19,22 @@ project preprocessor_tests : requirements on
test-suite preprocessor
:
- [ compile arithmetic.cpp ]
- [ compile array.cpp ]
- [ compile comparison.cpp ]
- [ compile control.cpp ]
- [ compile debug.cpp ]
- [ compile facilities.cpp ]
- [ compile iteration.cpp ]
- [ compile list.cpp ]
- [ compile logical.cpp ]
- [ compile repetition.cpp ]
- [ compile selection.cpp ]
- [ compile seq.cpp ]
- [ compile slot.cpp ]
- [ compile tuple.cpp ]
- [ compile variadic.cpp ]
+ [ compile arithmetic.cpp : gcc:-std=c++0x ]
+ [ compile array.cpp : gcc:-std=c++0x ]
+ [ compile comparison.cpp : gcc:-std=c++0x ]
+ [ compile control.cpp : gcc:-std=c++0x ]
+ [ compile debug.cpp : gcc:-std=c++0x ]
+ [ compile facilities.cpp : gcc:-std=c++0x ]
+ [ compile iteration.cpp : gcc:-std=c++0x ]
+ [ compile list.cpp : gcc:-std=c++0x ]
+ [ compile logical.cpp : gcc:-std=c++0x ]
+ [ compile punctuation.cpp : gcc:-std=c++0x ]
+ [ compile repetition.cpp : gcc:-std=c++0x ]
+ [ compile selection.cpp : gcc:-std=c++0x ]
+ [ compile seq.cpp : gcc:-std=c++0x ]
+ [ compile slot.cpp : gcc:-std=c++0x ]
+ [ compile tuple.cpp : gcc:-std=c++0x ]
+ [ compile variadic.cpp : gcc:-std=c++0x ]
;
test-suite preprocessor_nvm
@@ -88,6 +89,10 @@ test-suite preprocessor_c
: gcc:-std=c99
: logical_c
]
+ [ compile punctuation.c
+ : gcc:-std=c99
+ : punctuation_c
+ ]
[ compile selection.c
: gcc:-std=c99
: selection_c
@@ -173,3 +178,40 @@ test-suite preprocessor_c_nvm
: tuple_c_nvm
]
;
+
+test-suite preprocessor_isempty
+ :
+ [ compile isempty.cpp : gcc:-std=c++0x ]
+ [ compile-fail isempty_variadic_standard_failure.cpp : gcc:-std=c++0x ]
+ [ compile-fail isempty_variadic_standard_failure2.cpp : gcc:-std=c++0x ]
+ ;
+
+test-suite preprocessor_isempty_nvm
+ :
+ [ compile isempty.cpp : BOOST_PP_VARIADICS=0 : isempty_nvm ]
+ ;
+
+test-suite preprocessor_isempty_c
+ :
+ [ compile isempty.c
+ : gcc:-std=c99
+ : isempty_c
+ ]
+ [ compile-fail isempty_variadic_standard_failure.c
+ : gcc:-std=c99
+ : isempty_variadic_standard_failure_c
+ ]
+ [ compile-fail isempty_variadic_standard_failure2.c
+ : gcc:-std=c99
+ : isempty_variadic_standard_failure2_c
+ ]
+ ;
+
+test-suite preprocessor_isempty_c_nvm
+ :
+ [ compile isempty.c
+ : BOOST_PP_VARIADICS=0
+ gcc:-std=c99
+ : isempty_c_nvm
+ ]
+ ;
diff --git a/test/array.cxx b/test/array.cxx
index ae3a275..745581d 100644
--- a/test/array.cxx
+++ b/test/array.cxx
@@ -13,14 +13,19 @@
#
# include
# include
+# include
# include
+# include
# include
+# include
# include
+# include
# if BOOST_PP_VARIADICS
# include
# include
# endif
+# define ARRAY_EMPTY (0, ())
# define ARRAY (3, (0, 1, 2))
# define ARRAY_LARGE (33, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32))
# define ARRAY_VERY_LARGE (64, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63))
@@ -42,6 +47,7 @@ BEGIN BOOST_PP_ARRAY_SIZE(ARRAY_LARGE) == 33 END
BEGIN BOOST_PP_ARRAY_SIZE((33, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32))) == 33 END
BEGIN BOOST_PP_ARRAY_SIZE(ARRAY_VERY_LARGE) == 64 END
BEGIN BOOST_PP_ARRAY_SIZE((64, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63))) == 64 END
+BEGIN BOOST_PP_ARRAY_SIZE(ARRAY_EMPTY) == 0 END
// enum
@@ -57,6 +63,7 @@ BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_ARRAY_ENUM((5, (0, 1, 2, 3, 4)))) == 5 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_ARRAY_ENUM(ARRAY_LARGE)) == 33 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_ARRAY_ENUM(ARRAY_VERY_LARGE)) == 64 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_ARRAY_ENUM((64, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63)))) == 64 END
+BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_ARRAY_ENUM(ARRAY_EMPTY)) == 1 END
# endif
@@ -66,6 +73,7 @@ BEGIN BOOST_PP_LIST_AT(BOOST_PP_ARRAY_TO_LIST(ARRAY), 1) == 1 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_ARRAY_TO_LIST((5, (0, 1, 2, 3, 4))), 4) == 4 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_ARRAY_TO_LIST((33, (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32))), 26) == 26 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_ARRAY_TO_LIST(ARRAY_VERY_LARGE), 60) == 60 END
+BEGIN BOOST_PP_LIST_SIZE(BOOST_PP_ARRAY_TO_LIST(ARRAY_EMPTY)) == 0 END
// to_seq
@@ -104,6 +112,9 @@ BEGIN BOOST_PP_ARRAY_ELEM(22, BOOST_PP_ARRAY_INSERT(ARRAY_LARGE,22,1000)) == 100
BEGIN BOOST_PP_ARRAY_ELEM(26, BOOST_PP_ARRAY_INSERT(ARRAY_LARGE,22,1000)) == 25 END
BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_INSERT(ARRAY_LARGE,22,1000)) == 34 END
+BEGIN BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ARRAY_INSERT(ARRAY_EMPTY,0,25)) == 25 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_INSERT(ARRAY_EMPTY,0,1000)) == 1 END
+
// pop_back
BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_POP_BACK(ARRAY)) == 2 END
@@ -124,15 +135,19 @@ BEGIN BOOST_PP_ARRAY_ELEM(55, BOOST_PP_ARRAY_POP_FRONT(ARRAY_VERY_LARGE)) == 56
BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_PUSH_BACK(ARRAY, 3)) == 4 END
BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_PUSH_BACK(ARRAY_LARGE, 33)) == 34 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_PUSH_BACK(ARRAY_EMPTY, 10)) == 1 END
BEGIN BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ARRAY_PUSH_BACK(ARRAY, 3)) == 0 END
BEGIN BOOST_PP_ARRAY_ELEM(33, BOOST_PP_ARRAY_PUSH_BACK(ARRAY_LARGE, 33)) == 33 END
+BEGIN BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ARRAY_PUSH_BACK(ARRAY_EMPTY, 136)) == 136 END
// push_front
BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_PUSH_FRONT(ARRAY, 555)) == 4 END
BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_PUSH_FRONT(ARRAY_LARGE, 666)) == 34 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_PUSH_FRONT(ARRAY_EMPTY, 10)) == 1 END
BEGIN BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ARRAY_PUSH_FRONT(ARRAY, 555)) == 555 END
BEGIN BOOST_PP_ARRAY_ELEM(33, BOOST_PP_ARRAY_PUSH_FRONT(ARRAY_LARGE, 33)) == 32 END
+BEGIN BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ARRAY_PUSH_FRONT(ARRAY_EMPTY, 136)) == 136 END
// remove
@@ -157,3 +172,4 @@ BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_REVERSE(ARRAY_VERY_LARGE)) == 64 END
BEGIN BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ARRAY_REVERSE(ARRAY)) == 2 END
BEGIN BOOST_PP_ARRAY_ELEM(29, BOOST_PP_ARRAY_REVERSE(ARRAY_LARGE)) == 3 END
BEGIN BOOST_PP_ARRAY_ELEM(38, BOOST_PP_ARRAY_REVERSE(ARRAY_VERY_LARGE)) == 25 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_ARRAY_REVERSE(ARRAY_EMPTY)) == 0 END
diff --git a/test/isempty.c b/test/isempty.c
new file mode 100644
index 0000000..bd4c2c6
--- /dev/null
+++ b/test/isempty.c
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/isempty.cpp b/test/isempty.cpp
new file mode 100644
index 0000000..bd4c2c6
--- /dev/null
+++ b/test/isempty.cpp
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/isempty.cxx b/test/isempty.cxx
new file mode 100644
index 0000000..d0c3776
--- /dev/null
+++ b/test/isempty.cxx
@@ -0,0 +1,145 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
+#
+#if (BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()) || (BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC())
+
+# include
+# include
+# include
+
+#define DATA
+#define OBJECT OBJECT2
+#define OBJECT2
+#define FUNC(x) FUNC2(x)
+#define FUNC2(x)
+#define FUNC_GEN() ()
+#define FUNC_GEN2(x) ()
+#define FUNC_GEN3() (&)
+#define FUNC_GEN4(x) (y)
+#define FUNC_GEN5() (y,z)
+#define FUNC_GEN6() anything
+#define FUNC_GEN7(x) anything
+#define FUNC_GEN8(x,y) (1,2,3)
+#define FUNC_GEN9(x,y,z) anything
+#define FUNC_GEN10(x) (y) data
+#define NAME &name
+#define ATUPLE (atuple)
+#define ATUPLE_PLUS (atuple) data
+
+#if BOOST_PP_VARIADICS
+
+#if defined(BOOST_PP_VARIADICS_MSVC) /* Testing the VC++ variadic version */
+
+/* INCORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN2) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN3) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN4) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN5) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN8) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN10) == 1 END
+
+/* CORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN9) == 0 END
+
+#else /* Testing the non-VC++ variadic version */
+
+/* CORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN2) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN3) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN4) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN5) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN10) == 0 END
+
+/* COMPILER ERROR */
+
+// BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN8) == 0 END
+// BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN9) == 0 END
+
+#endif
+
+/* Testing the variadic version */
+
+/* CORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(DATA BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(x BOOST_PP_EMPTY()) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(OBJECT BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC(z) BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN6) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN7) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(NAME) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(ATUPLE) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(ATUPLE_PLUS) == 0 END
+
+#else
+
+#if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() /* Testing the VC++ non-variadic version */
+
+/* INCORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN2) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN3) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN4) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN5) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN8) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(ATUPLE) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN10) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(ATUPLE_PLUS) == 1 END
+
+/* CORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(NAME) == 0 END
+
+#else /* Testing the non-VC++ non-variadic version */
+
+/* CORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN2) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN3) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN4) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN5) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN8) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN10) == 0 END
+
+/* UNDEFINED BEHAVIOR */
+
+// BEGIN BOOST_PP_IS_EMPTY(ATUPLE) == 0 END
+// BEGIN BOOST_PP_IS_EMPTY(ATUPLE_PLUS) == 1 END
+// BEGIN BOOST_PP_IS_EMPTY(NAME) == 0 END
+
+#endif
+
+/* Testing the non-variadic version */
+
+/* CORRECT */
+
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(DATA BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(x BOOST_PP_EMPTY()) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(OBJECT BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC(z) BOOST_PP_EMPTY()) == 1 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN6) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN7) == 0 END
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN9) == 0 END
+
+#endif
+
+#endif
diff --git a/test/isempty_variadic_standard_failure.c b/test/isempty_variadic_standard_failure.c
new file mode 100644
index 0000000..36f6ff7
--- /dev/null
+++ b/test/isempty_variadic_standard_failure.c
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/isempty_variadic_standard_failure.cpp b/test/isempty_variadic_standard_failure.cpp
new file mode 100644
index 0000000..36f6ff7
--- /dev/null
+++ b/test/isempty_variadic_standard_failure.cpp
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/isempty_variadic_standard_failure.cxx b/test/isempty_variadic_standard_failure.cxx
new file mode 100644
index 0000000..bfbbc9d
--- /dev/null
+++ b/test/isempty_variadic_standard_failure.cxx
@@ -0,0 +1,25 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
+# include
+
+#if BOOST_PP_VARIADICS && (BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()) && !defined(BOOST_PP_VARIADICS_MSVC)
+
+#define FUNC_GEN8(x,y) (1,2,3)
+
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN8) == 0 END
+
+#else
+
+BEGIN 1 == 0 END
+
+#endif
diff --git a/test/isempty_variadic_standard_failure2.c b/test/isempty_variadic_standard_failure2.c
new file mode 100644
index 0000000..a2aa690
--- /dev/null
+++ b/test/isempty_variadic_standard_failure2.c
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/isempty_variadic_standard_failure2.cpp b/test/isempty_variadic_standard_failure2.cpp
new file mode 100644
index 0000000..a2aa690
--- /dev/null
+++ b/test/isempty_variadic_standard_failure2.cpp
@@ -0,0 +1,12 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/isempty_variadic_standard_failure2.cxx b/test/isempty_variadic_standard_failure2.cxx
new file mode 100644
index 0000000..d730626
--- /dev/null
+++ b/test/isempty_variadic_standard_failure2.cxx
@@ -0,0 +1,25 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
+# include
+
+#if BOOST_PP_VARIADICS && (BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()) && !defined(BOOST_PP_VARIADICS_MSVC)
+
+#define FUNC_GEN9(x,y,z) anything
+
+BEGIN BOOST_PP_IS_EMPTY(FUNC_GEN9) == 0 END
+
+#else
+
+BEGIN 1 == 0 END
+
+#endif
diff --git a/test/list.cxx b/test/list.cxx
index db6c432..7c99d70 100644
--- a/test/list.cxx
+++ b/test/list.cxx
@@ -16,17 +16,27 @@
# include
# include
# include
+# include
# include
# include
+# include
# include
+# include
# include
+# include
# include
# include
# define LISTNIL BOOST_PP_NIL
# define LIST (4, (1, (5, (2, BOOST_PP_NIL))))
-
# define REVERSAL(d, x, y) BOOST_PP_SUB_D(d, y, x)
+# define F1(r, state, x) + x + state
+# define FI2(r, state, i, x) BOOST_PP_IIF(BOOST_PP_EQUAL(i,1),+ x + x + state,+ x + state)
+# define F2(r, x) + BOOST_PP_TUPLE_ELEM(2, 0, x) + 2 - BOOST_PP_TUPLE_ELEM(2, 1, x)
+# define L1 (0, (x, BOOST_PP_NIL))
+# define L2 (a, (1, (b, (2, BOOST_PP_NIL))))
+# define L3 (c, (3, (d, BOOST_PP_NIL)))
+# define LL (L1, (L2, (L3, BOOST_PP_NIL)))
BEGIN BOOST_PP_LIST_FIRST(LIST) == 4 END
BEGIN BOOST_PP_LIST_IS_CONS(LIST) == 1 END
@@ -41,22 +51,28 @@ BEGIN BOOST_PP_VARIADIC_ELEM(2,BOOST_PP_LIST_ENUM(LIST)) == 5 END
#endif
BEGIN BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_SUB_D, 22, LIST) == 10 END
+BEGIN BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_SUB_D, 22, LISTNIL) == 22 END
BEGIN BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_ADD_D, 0, LIST) == 12 END
+BEGIN BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_ADD_D, 0, LISTNIL) == 0 END
BEGIN BOOST_PP_LIST_FOLD_RIGHT(REVERSAL, 0, LIST) == 4 END
BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_REVERSE(LIST)) == 2514 END
+BEGIN BOOST_PP_LIST_IS_NIL(BOOST_PP_LIST_REVERSE(LISTNIL)) == 1 END
BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_REST_N(2, LIST)) == 52 END
+BEGIN BOOST_PP_LIST_IS_NIL(BOOST_PP_LIST_REST_N(0, LISTNIL)) == 1 END
BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_FIRST_N(2, LIST)) == 41 END
BEGIN BOOST_PP_LIST_AT(LIST, 2) == 5 END
BEGIN BOOST_PP_LIST_SIZE(LIST) == 4 END
+BEGIN BOOST_PP_LIST_SIZE(LISTNIL) == 0 END
BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_TRANSFORM(BOOST_PP_ADD_D, 2, LIST)) == 6374 END
+BEGIN BOOST_PP_LIST_IS_NIL(BOOST_PP_LIST_TRANSFORM(BOOST_PP_ADD_D, 2, LISTNIL)) == 1 END
BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_APPEND(BOOST_PP_LIST_REST(LIST), LIST)) == 1524152 END
-
-# define F1(r, state, x) + x + state
-# define FI2(r, state, i, x) BOOST_PP_IIF(BOOST_PP_EQUAL(i,1),+ x + x + state,+ x + state)
+BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_APPEND(LIST,LISTNIL)) == 4152 END
+BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_APPEND(LISTNIL,LIST)) == 4152 END
+BEGIN BOOST_PP_LIST_IS_NIL(BOOST_PP_LIST_APPEND(LISTNIL,LISTNIL)) == 1 END
BEGIN BOOST_PP_LIST_FOR_EACH(F1, 1, LIST) == 16 END
BEGIN BOOST_PP_LIST_FOR_EACH_I(FI2, 1, LIST) == 17 END
@@ -64,17 +80,12 @@ BEGIN BOOST_PP_LIST_FOR_EACH_I(FI2, 1, LIST) == 17 END
BEGIN BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_LIST_TO_TUPLE(LIST)) == 2 END
BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_FILTER(BOOST_PP_LESS_D, 3, LIST)) == 45 END
+BEGIN BOOST_PP_LIST_IS_NIL(BOOST_PP_LIST_FILTER(BOOST_PP_LESS_D, 3, LISTNIL)) == 1 END
-# define F2(r, x) + BOOST_PP_TUPLE_ELEM(2, 0, x) + 2 - BOOST_PP_TUPLE_ELEM(2, 1, x)
BEGIN BOOST_PP_LIST_FOR_EACH_PRODUCT(F2, 2, ( (1, (0, BOOST_PP_NIL)), (2, (3, BOOST_PP_NIL)) )) == 0 END
-# define L1 (0, (x, BOOST_PP_NIL))
-# define L2 (a, (1, (b, (2, BOOST_PP_NIL))))
-# define L3 (c, (3, (d, BOOST_PP_NIL)))
-
-# define LL (L1, (L2, (L3, BOOST_PP_NIL)))
-
BEGIN BOOST_PP_LIST_CAT(BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_APPEND_D, BOOST_PP_NIL, LL)) == 0x0a1b2c3d END
BEGIN BOOST_PP_ARRAY_ELEM(2, BOOST_PP_LIST_TO_ARRAY(LIST)) == 5 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_LIST_TO_ARRAY(LISTNIL)) == 0 END
BEGIN BOOST_PP_SEQ_ELEM(3, BOOST_PP_LIST_TO_SEQ(LIST)) == 2 END
diff --git a/test/punctuation.c b/test/punctuation.c
new file mode 100644
index 0000000..8fc5dfc
--- /dev/null
+++ b/test/punctuation.c
@@ -0,0 +1,14 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Paul Mensonides 2002.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/punctuation.cpp b/test/punctuation.cpp
new file mode 100644
index 0000000..8fc5dfc
--- /dev/null
+++ b/test/punctuation.cpp
@@ -0,0 +1,14 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Paul Mensonides 2002.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* Revised by Edward Diener (2011) */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
diff --git a/test/punctuation.cxx b/test/punctuation.cxx
new file mode 100644
index 0000000..8e60e9a
--- /dev/null
+++ b/test/punctuation.cxx
@@ -0,0 +1,54 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# if BOOST_PP_VARIADICS
+# include
+# include
+
+# define A_TUPLE (*,#,zz)
+# define A_TUPLE2 (*,#,(zz,44,(e7)))
+# define A_TUPLE_PLUS (mmf,34,^^,!) 456
+# define PLUS_ATUPLE yyt (j,ii%)
+# define JDATA ggh
+# define NOT_TUPLE y6()
+# define NOT_TUPLE2 &(kkkgg,(e))
+# define A_SEQ (r)($)(#)
+# define AN_ARRAY (4,(5,7,f,x))
+# define A_LIST (e,(g,(&,BOOST_PP_NIL)))
+# define DATA (5 + 3) * 4
+# define DATA2 4 * (5 + 3)
+# define DATA3 4 * (5 + 3) * (2 + 1)
+# define DATA4 (5 + 3) * (2 + 1) * 4
+
+
+// is_begin_parens
+
+BEGIN BOOST_PP_IS_BEGIN_PARENS() == 0 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(A_TUPLE) == 1 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(A_TUPLE2) == 1 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(A_TUPLE_PLUS) == 1 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(PLUS_ATUPLE) == 0 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(JDATA) == 0 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(NOT_TUPLE) == 0 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(NOT_TUPLE2) == 0 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(A_SEQ) == 1 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(AN_ARRAY) == 1 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS(A_LIST) == 1 END
+BEGIN BOOST_PP_IS_BEGIN_PARENS((y)2(x)) == 1 END
+
+// remove_parens
+
+BEGIN BOOST_PP_REMOVE_PARENS(DATA) == 17 END
+BEGIN BOOST_PP_REMOVE_PARENS(DATA2)== 32 END
+BEGIN BOOST_PP_REMOVE_PARENS(DATA3)== 96 END
+BEGIN BOOST_PP_REMOVE_PARENS(DATA4)== 41 END
+
+#endif
diff --git a/test/seq.cxx b/test/seq.cxx
index c64085d..ae37291 100644
--- a/test/seq.cxx
+++ b/test/seq.cxx
@@ -16,13 +16,18 @@
# include
# include
# include
+# include
# include
# include
+# include
# include
+# include
# include
+# include
# include
# include
+# define SEQ_NONE ()
# define SEQ (4)(1)(5)(2)
# define SEQVAR (4,5,8,3,61)(1,0)(5,22,43)(2)(17,45,33)
@@ -53,8 +58,19 @@ BEGIN BOOST_PP_SEQ_FOR_EACH(F1, 1, SEQ) == 16 END
BEGIN BOOST_PP_SEQ_FOR_EACH_I(FI2, 1, SEQ) == 21 END
BEGIN BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_SEQ_TO_TUPLE(SEQ)) == 2 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1, 0, BOOST_PP_SEQ_TO_TUPLE(SEQ_NONE))) == 1 END
+
+#if BOOST_PP_VARIADICS
+
+BEGIN BOOST_PP_TUPLE_SIZE(BOOST_PP_SEQ_TO_TUPLE(SEQ_NONE)) == 1 END
+
+#endif
+
BEGIN BOOST_PP_ARRAY_ELEM(3, BOOST_PP_SEQ_TO_ARRAY(SEQ)) == 2 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_ARRAY_ELEM(0, BOOST_PP_SEQ_TO_ARRAY(SEQ_NONE))) == 1 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_SEQ_TO_ARRAY(SEQ_NONE)) == 1 END
+
# define LESS_S(s, x, y) BOOST_PP_LESS(x, y)
BEGIN BOOST_PP_SEQ_CAT(BOOST_PP_SEQ_FILTER(LESS_S, 3, SEQ)) == 45 END
@@ -98,6 +114,8 @@ BEGIN BOOST_PP_SEQ_CAT(BOOST_PP_SEQ_TAIL(BOOST_PP_SEQ_FOLD_LEFT(SEQ_APPEND, (~),
BEGIN BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(BOOST_PP_SEQ_FOLD_LEFT(SEQ_APPEND, (~), LL))) == 9 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_SEQ_TO_LIST(SEQ), 2) == 5 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_LIST_AT(BOOST_PP_SEQ_TO_LIST(SEQ_NONE),0)) == 1 END
+BEGIN BOOST_PP_LIST_SIZE(BOOST_PP_SEQ_TO_LIST(SEQ_NONE)) == 1 END
#if BOOST_PP_VARIADICS
diff --git a/test/tuple.cxx b/test/tuple.cxx
index d5d941a..68d7209 100644
--- a/test/tuple.cxx
+++ b/test/tuple.cxx
@@ -7,21 +7,29 @@
# * *
# ************************************************************************** */
#
-# /* Revised by Edward Diener (2011) */
+# /* Revised by Edward Diener (2011,2014) */
#
# /* See http://www.boost.org for most recent version. */
#
+# include
+# include
# include
# include
+# include
# include
+# include
# include
+# include
+# include
# if BOOST_PP_VARIADICS
# include
# include
# endif
# include
+# include
# define TUPLE (0, 1, 2, 3, 4, 5)
+# define TUPLE_NONE ()
# define TUPLE_LARGE (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32)
# define TUPLE_VERY_LARGE (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63)
# define T2 (+3, /2, +6)
@@ -44,6 +52,7 @@
// elem
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1, 0, TUPLE_NONE)) == 1 END
BEGIN BOOST_PP_TUPLE_ELEM(6, 3, TUPLE) == 3 END
BEGIN BOOST_PP_TUPLE_ELEM(6, 5, TUPLE) == 5 END
BEGIN BOOST_PP_TUPLE_ELEM(33, 15, TUPLE_LARGE) == 15 END
@@ -72,23 +81,30 @@ BEGIN TEST_EAT_VERY_LARGE == 8 END
BEGIN BOOST_PP_ARRAY_ELEM(3,BOOST_PP_TUPLE_TO_ARRAY(6,TUPLE)) == 3 END
BEGIN BOOST_PP_ARRAY_ELEM(29,BOOST_PP_TUPLE_TO_ARRAY(33,TUPLE_LARGE)) == 29 END
BEGIN BOOST_PP_ARRAY_ELEM(61,BOOST_PP_TUPLE_TO_ARRAY(64,TUPLE_VERY_LARGE)) == 61 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_ARRAY_ELEM(0,BOOST_PP_TUPLE_TO_ARRAY(1,TUPLE_NONE))) == 1 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_TO_ARRAY(1,TUPLE_NONE)) == 1 END
// to_list
BEGIN BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(6,TUPLE), 2) == 2 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(33,TUPLE_LARGE), 19) == 19 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(64,TUPLE_VERY_LARGE), 62) == 62 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(1,TUPLE_NONE), 0)) == 1 END
+BEGIN BOOST_PP_LIST_SIZE(BOOST_PP_TUPLE_TO_LIST(1,TUPLE_NONE)) == 1 END
// to_seq
BEGIN BOOST_PP_SEQ_ELEM(4,BOOST_PP_TUPLE_TO_SEQ(6,TUPLE)) == 4 END
BEGIN BOOST_PP_SEQ_ELEM(31,BOOST_PP_TUPLE_TO_SEQ(33,TUPLE_LARGE)) == 31 END
BEGIN BOOST_PP_SEQ_ELEM(55,BOOST_PP_TUPLE_TO_SEQ(64,TUPLE_VERY_LARGE)) == 55 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_SEQ_ELEM(0,BOOST_PP_TUPLE_TO_SEQ(1,TUPLE_NONE))) == 1 END
+BEGIN BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_TO_SEQ(1,TUPLE_NONE)) == 1 END
#if BOOST_PP_VARIADICS
// elem
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0, TUPLE_NONE)) == 1 END
BEGIN BOOST_PP_TUPLE_ELEM(3, TUPLE) == 3 END
BEGIN BOOST_PP_TUPLE_ELEM(5, TUPLE) == 5 END
BEGIN BOOST_PP_TUPLE_ELEM(15, TUPLE_LARGE) == 15 END
@@ -158,7 +174,7 @@ BEGIN BOOST_PP_TUPLE_ELEM(33, BOOST_PP_TUPLE_PUSH_FRONT(TUPLE_LARGE, 33)) == 32
// rem
-#if BOOST_PP_VARIADICS_MSVC && _MSC_VER == 1400
+#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM(6)(0, 1, 2, 3, 4, 5)) == 6 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM(33)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32)) == 33 END
@@ -166,6 +182,12 @@ BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM(64)(0, 1, 2, 3, 4, 5, 6, 7, 8, 9
#else
+#if BOOST_PP_VARIADICS_MSVC
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_TUPLE_REM_CAT() TUPLE_NONE) == 1 END
+#else
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_TUPLE_REM() TUPLE_NONE) == 1 END
+#endif
+
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM()(0, 1, 2, 3, 4, 5)) == 6 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM()(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32)) == 33 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM()(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63)) == 64 END
@@ -174,6 +196,7 @@ BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM()(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
// rem_ctor
+BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM_CTOR(TUPLE_NONE)) == 1 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM_CTOR(TUPLE)) == 6 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM_CTOR(TUPLE_LARGE)) == 33 END
BEGIN BOOST_PP_VARIADIC_SIZE(BOOST_PP_TUPLE_REM_CTOR(TUPLE_VERY_LARGE)) == 64 END
@@ -206,17 +229,23 @@ BEGIN BOOST_PP_TUPLE_SIZE(TUPLE_VERY_LARGE) == 64 END
BEGIN BOOST_PP_ARRAY_ELEM(3,BOOST_PP_TUPLE_TO_ARRAY(TUPLE)) == 3 END
BEGIN BOOST_PP_ARRAY_ELEM(29,BOOST_PP_TUPLE_TO_ARRAY(TUPLE_LARGE)) == 29 END
BEGIN BOOST_PP_ARRAY_ELEM(61,BOOST_PP_TUPLE_TO_ARRAY(TUPLE_VERY_LARGE)) == 61 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_ARRAY_ELEM(0,BOOST_PP_TUPLE_TO_ARRAY(TUPLE_NONE))) == 1 END
+BEGIN BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_TO_ARRAY(TUPLE_NONE)) == 1 END
// to_tuple
BEGIN BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(TUPLE), 2) == 2 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(TUPLE_LARGE), 19) == 19 END
BEGIN BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(TUPLE_VERY_LARGE), 62) == 62 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_LIST_AT(BOOST_PP_TUPLE_TO_LIST(TUPLE_NONE), 0)) == 1 END
+BEGIN BOOST_PP_LIST_SIZE(BOOST_PP_TUPLE_TO_LIST(TUPLE_NONE)) == 1 END
// to_seq
BEGIN BOOST_PP_SEQ_ELEM(4,BOOST_PP_TUPLE_TO_SEQ(TUPLE)) == 4 END
BEGIN BOOST_PP_SEQ_ELEM(31,BOOST_PP_TUPLE_TO_SEQ(TUPLE_LARGE)) == 31 END
BEGIN BOOST_PP_SEQ_ELEM(55,BOOST_PP_TUPLE_TO_SEQ(TUPLE_VERY_LARGE)) == 55 END
+BEGIN BOOST_PP_IS_EMPTY(BOOST_PP_SEQ_ELEM(0,BOOST_PP_TUPLE_TO_SEQ(TUPLE_NONE))) == 1 END
+BEGIN BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_TO_SEQ(TUPLE_NONE)) == 1 END
#endif
diff --git a/test/tuple_elem_bug_test.cxx b/test/tuple_elem_bug_test.cxx
new file mode 100644
index 0000000..56e36a6
--- /dev/null
+++ b/test/tuple_elem_bug_test.cxx
@@ -0,0 +1,38 @@
+# /* **************************************************************************
+# * *
+# * (C) Copyright Edward Diener 2014.
+# * Distributed under the Boost Software License, Version 1.0. (See
+# * accompanying file LICENSE_1_0.txt or copy at
+# * http://www.boost.org/LICENSE_1_0.txt)
+# * *
+# ************************************************************************** */
+#
+# /* See http://www.boost.org for most recent version. */
+#
+# include
+# include
+# include
+# include
+
+#define TN_GEN_ONE(p) (1)
+#define TN_GEN_ZERO(p) (0)
+#define TN_TEST_ONE_MORE(parameter,ens) \
+ BOOST_PP_IF \
+ ( \
+ BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(1,0,ens),0), \
+ TN_GEN_ONE, \
+ TN_GEN_ZERO \
+ ) \
+ (parameter) \
+/**/
+#define TN_TEST_ONE(parameter,ens) \
+ BOOST_PP_TUPLE_ELEM \
+ ( \
+ 1, \
+ 0, \
+ TN_TEST_ONE_MORE(parameter,ens) \
+ ) \
+/**/
+
+BEGIN TN_TEST_ONE(A,(1)) == 1 END
+BEGIN TN_TEST_ONE(A,()) == 0 END