$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r74496 - in sandbox/local: boost/detail/preprocessor/keyword/facility boost/detail/preprocessor/variadic_macro_data/detail boost/local/aux_/preprocessor/variadic boost/utility libs/local/doc/qbk
From: lorcaminiti_at_[hidden]
Date: 2011-09-21 14:01:49
Author: lcaminiti
Date: 2011-09-21 14:01:48 EDT (Wed, 21 Sep 2011)
New Revision: 74496
URL: http://svn.boost.org/trac/boost/changeset/74496
Log:
Committing some pp improvements(?) used to program contract library.
Text files modified: 
   sandbox/local/boost/detail/preprocessor/keyword/facility/is.hpp                   |    18 ++++++++++++++-                         
   sandbox/local/boost/detail/preprocessor/keyword/facility/remove.hpp               |    20 ++++++++++++++++-                       
   sandbox/local/boost/detail/preprocessor/variadic_macro_data/detail/vmd_detail.hpp |     9 +++++++                                 
   sandbox/local/boost/local/aux_/preprocessor/variadic/is.hpp                       |    44 ++++++++++++++++++++++++++++++----------
   sandbox/local/boost/utility/identity.hpp                                          |    10 +++++++++                               
   sandbox/local/libs/local/doc/qbk/local.qbk                                        |     2                                         
   6 files changed, 86 insertions(+), 17 deletions(-)
Modified: sandbox/local/boost/detail/preprocessor/keyword/facility/is.hpp
==============================================================================
--- sandbox/local/boost/detail/preprocessor/keyword/facility/is.hpp	(original)
+++ sandbox/local/boost/detail/preprocessor/keyword/facility/is.hpp	2011-09-21 14:01:48 EDT (Wed, 21 Sep 2011)
@@ -15,10 +15,24 @@
 #include <boost/preprocessor/detail/is_unary.hpp>
 #include <boost/preprocessor/cat.hpp>
 
+// PRIVATE //
+
+#define BOOST_DETAIL_PP_KEYWORD_FACILITY_IS_(a, b) \
+    BOOST_PP_IS_UNARY(BOOST_PP_CAT(a, b))
+
+// PUBLIC //
+
 // `chekcing_prefix ## tokens` expand to unary (e.g., `(1)`) iff `tokens` start
 // with keyword to check.
 #define BOOST_DETAIL_PP_KEYWORD_FACILITY_IS_FRONT(tokens, checking_prefix) \
-    BOOST_PP_IS_UNARY(BOOST_PP_CAT(checking_prefix, tokens))
+    BOOST_PP_IIF(BOOST_PP_IS_UNARY(tokens), \
+        /* on MSVC this check works even if tokens already unary but on */ \
+        /* ISO C++ (including GCC) this check on non-unary tokens gives */ \
+        /* a concatenation error -- so return false is tokens is not unary */ \
+        0 BOOST_PP_TUPLE_EAT(2) \
+    , \
+        BOOST_DETAIL_PP_KEYWORD_FACILITY_IS_ \
+    )(checking_prefix, tokens)
 
 // `token ## chekcing_postfix` expand to unary (e.g., `(1)`) iff `token` is the
 // keyword to check. This check only works if `token` is a single token, it
@@ -26,7 +40,7 @@
 // This check will expand to 0 with no error if `token` starts with a
 // non-alphanumeric symbol (e.g., `*this`).
 #define BOOST_DETAIL_PP_KEYWORD_FACILITY_IS_BACK(token, checking_postfix) \
-    BOOST_PP_IS_UNARY(BOOST_PP_CAT(token, checking_postfix))
+    BOOST_DETAIL_PP_KEYWORD_FACILITY_IS_(token, checking_postfix)
 
 #endif // #include guard
 
Modified: sandbox/local/boost/detail/preprocessor/keyword/facility/remove.hpp
==============================================================================
--- sandbox/local/boost/detail/preprocessor/keyword/facility/remove.hpp	(original)
+++ sandbox/local/boost/detail/preprocessor/keyword/facility/remove.hpp	2011-09-21 14:01:48 EDT (Wed, 21 Sep 2011)
@@ -9,14 +9,30 @@
 
 #include <boost/preprocessor/control/iif.hpp>
 #include <boost/preprocessor/tuple/eat.hpp>
-#include <boost/preprocessor/facilities/expand.hpp>
 #include <boost/preprocessor/cat.hpp>
 
+// PRIVATE //
+
+// From PP_EXPAND (my own reentrant version).
+#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#   define BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_(x) \
+        BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_I_(x)
+#else
+#   define BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_(x) \
+        BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_OO_((x))
+#   define BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_OO_(par) \
+        BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_I_ ## par
+#endif
+#define BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_I_(x) x
+
+// PUBLIC //
+
 // `is_front_macro(tokens)` is 1 iff `tokens` start with keyword to remove.
 // `removing_prefix ## <keyword-to-remove>` must expand to nothing.
 #define BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT( \
         tokens, is_front_macro, removing_prefix) \
-    BOOST_PP_EXPAND( /* without EXPAND doesn't expand on MSVC */ \
+    /* without EXPAND doesn't expand on MSVC */ \
+    BOOST_DETAIL_PP_KEYWORD_FACILITY_REMOVE_FRONT_EXPAND_( \
         BOOST_PP_IIF(is_front_macro(tokens), \
             BOOST_PP_CAT \
         , \
Modified: sandbox/local/boost/detail/preprocessor/variadic_macro_data/detail/vmd_detail.hpp
==============================================================================
--- sandbox/local/boost/detail/preprocessor/variadic_macro_data/detail/vmd_detail.hpp	(original)
+++ sandbox/local/boost/detail/preprocessor/variadic_macro_data/detail/vmd_detail.hpp	2011-09-21 14:01:48 EDT (Wed, 21 Sep 2011)
@@ -124,8 +124,15 @@
   BOOST_DETAIL_PP_VMD_DETAIL_REMOVE_TUPLE_PARENS tuple \
 /**/
 #if defined(BOOST_MSVC)
+#  if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()
+#    define BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND(x) BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND_I(x)
+#  else
+#    define BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND(x) BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND_OO((x))
+#    define BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND_OO(par) BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND_I ## par
+#  endif
+#  define BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND_I(x) x
 #define BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE(...) \
-  BOOST_PP_ADD(BOOST_DETAIL_PP_VMD_DETAIL_APPLY(BOOST_DETAIL_PP_VMD_DETAIL_ARG_N, (__VA_ARGS__, BOOST_DETAIL_PP_VMD_DETAIL_RSEQ_N())),0) \
+  BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE_EXPAND(BOOST_DETAIL_PP_VMD_DETAIL_APPLY(BOOST_DETAIL_PP_VMD_DETAIL_ARG_N, (__VA_ARGS__, BOOST_DETAIL_PP_VMD_DETAIL_RSEQ_N()))) \
 /**/
 #else
 #define BOOST_DETAIL_PP_VMD_DETAIL_DATA_SIZE(...) \
Modified: sandbox/local/boost/local/aux_/preprocessor/variadic/is.hpp
==============================================================================
--- sandbox/local/boost/local/aux_/preprocessor/variadic/is.hpp	(original)
+++ sandbox/local/boost/local/aux_/preprocessor/variadic/is.hpp	2011-09-21 14:01:48 EDT (Wed, 21 Sep 2011)
@@ -13,26 +13,48 @@
 
 #include "size.hpp"
 #include "eat.hpp"
-#include <boost/preprocessor/logical/not.hpp>
-#include <boost/preprocessor/control/if.hpp>
-#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/logical/compl.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
 // `IS_UNARY` not working on Borland and other pp which have no variadic anyway.
 #include <boost/preprocessor/detail/is_unary.hpp>
 
 // PRIVATE //
 
-#define BOOST_LOCAL_AUX_PP_IS_VARIADIC_NOT_UNARY_(...) \
-    BOOST_PP_NOT(BOOST_PP_IS_UNARY(__VA_ARGS__))
+#define BOOST_LOCAL_AUX_PP_IS_VARIADIC_NOT_UNARY1_(tokens) \
+    BOOST_PP_COMPL(BOOST_PP_IS_UNARY(tokens))
+    
+#define BOOST_LOCAL_AUX_PP_IS_VARIADIC_REMOVE1_(tokens) /* nothing */
+        
+// Tokens `(t1) t2`.
+#define BOOST_LOCAL_AUX_PP_IS_VARIADIC_SKIP1_(tokens) \
+    BOOST_LOCAL_AUX_PP_IS_VARIADIC_NOT_UNARY1_( \
+        BOOST_LOCAL_AUX_PP_IS_VARIADIC_REMOVE1_ tokens \
+        (1) /* trailing unary handles empty */ \
+    )
+
+#define BOOST_LOCAL_AUX_PP_IS_VARIADIC_NOT_UNARY2_(tokens) \
+    BOOST_PP_IIF(BOOST_PP_IS_UNARY(tokens), \
+        BOOST_LOCAL_AUX_PP_IS_VARIADIC_SKIP1_ \
+    , \
+        1 /* it is not unary */ \
+        BOOST_PP_TUPLE_EAT(1) \
+    )(tokens)
+
+#define BOOST_LOCAL_AUX_PP_IS_VARIADIC_(size, ...) \
+    BOOST_PP_IIF(BOOST_PP_EQUAL(size, 1), \
+        BOOST_LOCAL_AUX_PP_IS_VARIADIC_NOT_UNARY2_ \
+    , /* size == 0 or size > 1 (it's variadic) */ \
+        1 \
+        BOOST_LOCAL_AUX_PP_VARIADIC_EAT \
+    )(__VA_ARGS__)
 
 // PUBLIC //
 
 #define BOOST_LOCAL_AUX_PP_IS_VARIADIC(...) \
-    BOOST_PP_IF(BOOST_PP_GREATER( /* IIF does not expand on MSVC */ \
-            BOOST_LOCAL_AUX_PP_VARIADIC_SIZE(__VA_ARGS__), 1), \
-        1 BOOST_LOCAL_AUX_PP_VARIADIC_EAT \
-    , \
-        BOOST_LOCAL_AUX_PP_IS_VARIADIC_NOT_UNARY_ \
-    )(__VA_ARGS__)
+    BOOST_LOCAL_AUX_PP_IS_VARIADIC_( \
+            BOOST_LOCAL_AUX_PP_VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
 
 #endif // BOOST_NO_VARIADIC_MACROS
 
Modified: sandbox/local/boost/utility/identity.hpp
==============================================================================
--- sandbox/local/boost/utility/identity.hpp	(original)
+++ sandbox/local/boost/utility/identity.hpp	2011-09-21 14:01:48 EDT (Wed, 21 Sep 2011)
@@ -51,6 +51,16 @@
  * contains a comma not wrapped by round parenthesis so it will be interpreted
  * as two separate macro parameters by the preprocessor).
  *
+ * On some compilers (like GCC), using this macro on abstract types (classes
+ * with one or more pure virtual functions) generate a compile-time error.
+ * This can be worked around by manipulating the type adding and removing a
+ * reference to it:
+ * @code
+ *  boost::remove_reference< BOOST_IDENTITY_TYPE((boost::add_reference<
+ *      my_abstract_type< int, double >
+ *  >::type)) >::type
+ * @endcode
+ *
  * @Params
  * @Param{parenthesized_type,
  *  The type expression to be passed as macro parameter wrapped by a single set
Modified: sandbox/local/libs/local/doc/qbk/local.qbk
==============================================================================
--- sandbox/local/libs/local/doc/qbk/local.qbk	(original)
+++ sandbox/local/libs/local/doc/qbk/local.qbk	2011-09-21 14:01:48 EDT (Wed, 21 Sep 2011)
@@ -9,7 +9,7 @@
     [version 0.2.0 ]
     [/ purpose Local functions, blocks, and exits for C++]
     [/ category Function Objects and Higher-Order Programming]
-    [authors [Caminiti (lorcaminiti -at- gmail.com), Lorenzo]]
+    [authors [Caminiti <lorcaminiti-AT-gmail.com>, Lorenzo]]
     [copyright 2009-2011 Lorenzo Caminiti]
     [license
         Use, modification, and distribution is subject to the