Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r67926 - in sandbox/local/boost: . detail detail/preprocessor detail/preprocessor/keyword detail/preprocessor/keyword/concept detail/preprocessor/keyword/contract detail/preprocessor/keyword/parameter detail/preprocessor/sign detail/preprocessor/sign/aux_ detail/preprocessor/sign/aux_/parse detail/preprocessor/sign/aux_/parse/all_params detail/preprocessor/sign/aux_/parse/all_params/param_ detail/preprocessor/sign/aux_/parse/all_params/params_ detail/preprocessor/sign/aux_/parse/postcondition detail/preprocessor/sign/aux_/parsed detail/preprocessor/sign/aux_/parser detail/preprocessor/sign/param detail/preprocessor/sign/params detail/preprocessor/sign/parse detail/preprocessor/sign/parser detail/preprocessor/sign/validate detail/type_traits local local/aux_ local/aux_/function local/aux_/function/code_ local/aux_/preprocessor local/aux_/preprocessor/keyword local/aux_/preprocessor/sign local/aux_/preprocessor/sign/params local/aux_/scope_exit local/aux_/scope_exit/typeof local/aux_/scope_exit/typeof/msvc utility utility/aux_
From: lorcaminiti_at_[hidden]
Date: 2011-01-10 16:03:49


Author: lcaminiti
Date: 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
New Revision: 67926
URL: http://svn.boost.org/trac/boost/changeset/67926

Log:
Added Boost.Local header files.
Added:
   sandbox/local/boost/
   sandbox/local/boost/detail/
   sandbox/local/boost/detail/preprocessor/
   sandbox/local/boost/detail/preprocessor/cat_if.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/
   sandbox/local/boost/detail/preprocessor/keyword/check.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/concept/
   sandbox/local/boost/detail/preprocessor/keyword/concept/is_requires.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/contract/
   sandbox/local/boost/detail/preprocessor/keyword/contract/is_copyable.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/contract/is_importance.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/contract/is_invariant.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/contract/is_postcondition.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/contract/is_precondition.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_and.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_and_eq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_asm.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_auto.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_bitand.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_bitor.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_bool.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_break.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_case.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_catch.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_char.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_class.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_compl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_const.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_const_cast.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_continue.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_default.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_delete.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_do.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_double.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_dynamic_cast.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_else.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_enum.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_explicit.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_export.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_extern.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_false.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_float.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_for.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_friend.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_goto.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_if.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_inline.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_int.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_long.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_mutable.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_namespace.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_new.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_not.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_not_eq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_operator.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_or.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_or_eq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_private.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_protected.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_public.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_register.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_reinterpret_cast.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_return.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_short.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_signed.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_sizeof.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_static.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_static_cast.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_struct.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_switch.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_template.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_this.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_throw.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_true.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_try.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_typedef.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_typeid.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_typename.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_union.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_unsigned.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_using.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_virtual.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_void.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_volatile.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_wchar_t.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_while.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_xor.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/is_xor_eq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/parameter/
   sandbox/local/boost/detail/preprocessor/keyword/parameter/is_deduced.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/parameter/is_in.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/parameter/is_inout.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/keyword/parameter/is_out.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/nilseq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/nonempty_is_xxx.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/range.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/seq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/
   sandbox/local/boost/detail/preprocessor/sign/access.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/
   sandbox/local/boost/detail/preprocessor/sign/aux_/class_base_indexes.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/param_indexes.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/params_indexes.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/copyable.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/is_classified.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/opt_req.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/single.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/all.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/deduced.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/named.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/positional.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/tag_namespace.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/tparams.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_1.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_2.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_i_.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_ii_.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/if.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/if_1.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/not.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/opt.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/postcondition/
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/postcondition/with_result.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/postcondition/without_result.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/req.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/return.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_not.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_opt.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_req.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parse/until.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/
   sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/count.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/elem.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/indexes.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_msg.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_none.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_set.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/indexes.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/is_member.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/merge.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_next.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_set.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_skip.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_append.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_back.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_nil.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_replace_back.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_set.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/body.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/class_base.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/class_bases.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/class_invariants.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/class_type.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/const.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/copyable.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/explicit.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/export.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/extern.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/initializers.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/inline.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/member.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/name.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/param/
   sandbox/local/boost/detail/preprocessor/sign/param.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/param/classifier.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/param/default.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/param/name.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/param/qualifier.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/param/type.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/
   sandbox/local/boost/detail/preprocessor/sign/params.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/enum.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/first_n.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/fold_left.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/for_each.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/named.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/size.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/tag_namespace.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/params/to_seq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/
   sandbox/local/boost/detail/preprocessor/sign/parse/access.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/base_types.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/body.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/class_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/class_type.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/const.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/constructor_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/copyable.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/destructor_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/explicit.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/export.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/extern.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/finish.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/function_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/initializers.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/inline.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/invariant.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/name.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/params.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/postcondition.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/precondition.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/requires.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/result_type.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/start.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/static.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/static_invariant.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/template.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/throw.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/virtual.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parse/volatile.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parser/
   sandbox/local/boost/detail/preprocessor/sign/parser/apply.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parser/err.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parser/seq.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/parser/sign.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/postcondition.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/precondition.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/requires.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/result_type.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/static.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/template_params.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/throw.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/validate/
   sandbox/local/boost/detail/preprocessor/sign/validate/basic.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/validate/class_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/validate/constructor_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/validate/destructor_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/validate/member_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/validate/nonmember_decl.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/validate/return.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/virtual.hpp (contents, props changed)
   sandbox/local/boost/detail/preprocessor/sign/volatile.hpp (contents, props changed)
   sandbox/local/boost/detail/type_traits/
   sandbox/local/boost/detail/type_traits/add_pointed_const.hpp (contents, props changed)
   sandbox/local/boost/detail/type_traits/is_inner_const.hpp (contents, props changed)
   sandbox/local/boost/local/
   sandbox/local/boost/local/aux_/
   sandbox/local/boost/local/aux_/block.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/exit.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/file.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/function/
   sandbox/local/boost/local/aux_/function/base.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/function/code_/
   sandbox/local/boost/local/aux_/function/code_/binding.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/function/code_/functor.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/function/code_/param.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/function/decl.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/function/end.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/function_ref.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/
   sandbox/local/boost/local/aux_/preprocessor/keyword/
   sandbox/local/boost/local/aux_/preprocessor/keyword/is_bind.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/keyword/is_const_bind.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/
   sandbox/local/boost/local/aux_/preprocessor/sign/params/
   sandbox/local/boost/local/aux_/preprocessor/sign/params/all_bind_names.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/bind_names.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/const_bind_names.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/has_any_bind.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/has_bind.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/has_const_bind.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/has_unbind.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/this.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/params/unbind.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/parse_decl.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/preprocessor/sign/validate_.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/scope_exit/
   sandbox/local/boost/local/aux_/scope_exit/scope_exit.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/scope_exit/typeof/
   sandbox/local/boost/local/aux_/scope_exit/typeof/msvc/
   sandbox/local/boost/local/aux_/scope_exit/typeof/msvc/typeof_impl.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/scope_exit/typeof/typeof.hpp (contents, props changed)
   sandbox/local/boost/local/aux_/symbol.hpp (contents, props changed)
   sandbox/local/boost/local/block.hpp (contents, props changed)
   sandbox/local/boost/local/config.hpp (contents, props changed)
   sandbox/local/boost/local/exit.hpp (contents, props changed)
   sandbox/local/boost/local/function.hpp (contents, props changed)
   sandbox/local/boost/local/function_ref.hpp (contents, props changed)
   sandbox/local/boost/utility/
   sandbox/local/boost/utility/aux_/
   sandbox/local/boost/utility/aux_/identity.hpp (contents, props changed)
   sandbox/local/boost/utility/identity.hpp (contents, props changed)

Added: sandbox/local/boost/detail/preprocessor/cat_if.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/cat_if.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,47 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_CAT_IF_HPP_
+#define BOOST_DETAIL_PP_CAT_IF_HPP_
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+
+#define BOOST_DETAIL_PP_CAT_IF_YES_(left, right, nocat) \
+ BOOST_PP_CAT(left, right)
+
+#define BOOST_DETAIL_PP_CAT_IF_NO_(left, right, nocat) \
+ nocat
+
+#define BOOST_DETAIL_PP_CAT_IIF_(condition01, left, right, nocat) \
+ BOOST_PP_IIF(condition01, \
+ BOOST_DETAIL_PP_CAT_IF_YES_ \
+ , \
+ BOOST_DETAIL_PP_CAT_IF_NO_ \
+ )(left, right, nocat)
+
+// Public API.
+
+// If `condition` then `left ## right` else `left`.
+#define BOOST_DETAIL_PP_CAT_IIF(condition01, left, right) \
+ BOOST_DETAIL_PP_CAT_IIF_(condition01, left, right, left)
+
+// If `condition` then `left ## right` else `right`.
+#define BOOST_DETAIL_PP_CAT_IIF_RIGHT(condition01, left, right) \
+ BOOST_DETAIL_PP_CAT_IIF_(condition01, left, right, right)
+
+// If `condition` then `left ## right` else `left`.
+#define BOOST_DETAIL_PP_CAT_IF(condition, left, right) \
+ BOOST_DETAIL_PP_CAT_IIF_(BOOST_PP_BOOL(condition), left, right, left)
+
+// If `condition` then `left ## right` else `right`.
+#define BOOST_DETAIL_PP_CAT_IF_RIGHT(condition01, left, right) \
+ BOOST_DETAIL_PP_CAT_IIF_(BOOST_PP_BOOL(condition), left, right, right)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/check.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/check.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_CHECK_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_CHECK_HPP_
+
+// Boost.Preprocessor author P. Mensodines confirmed on an Boost email thread
+// (subject ``check if a token is a keyword (was "BOOST_PP_IS_UNARY()")'')
+// that it is OK to used `PP_IS_UNARY()` to check if tokens match predefined
+// "keyword" as it is done by the macros below (even if `PP_IS_UNARY()` is
+// technically only part of Boost.Preprocessor private API).
+#include <boost/preprocessor/detail/is_unary.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// Expand to true iff keyword_prefix ## token is #defined, e.g.:
+// #define KWD_VOID_void (1) // Can be 1 or any non-empty token.
+// #define IS_VOID(tok) BOOST_DETAIL_PP_KEYWORD_CHECK(KWD_VOID_, tok)
+// IS_VOID(void) // Expand to 1.
+// IS_VOID(abcd) // Expand to 0.
+#define BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, keyword_prefix) \
+ BOOST_PP_IS_UNARY(BOOST_PP_CAT(keyword_prefix, tokens))
+
+// This allow for special symbols in from of the check tokens because it checks
+// from the "trail" of tokens. However, it only works iff there is only one
+// single valid token in tokens. For example, `&this` can be checked to be
+// `this` instead `& const this` will not check to be `this`.
+#define BOOST_DETAIL_PP_KEYWORD_CHECK_BACK(tokens, keyword_postfix) \
+ BOOST_PP_IS_UNARY(BOOST_PP_CAT(tokens, keyword_postfix))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/concept/is_requires.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/concept/is_requires.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_REQUIRES_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_REQUIRES_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_REQUIRES_requires (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_REQUIRES(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_REQUIRES_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/contract/is_copyable.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/contract/is_copyable.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_COPYABLE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_COPYABLE_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_COPYABLE_copyable (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_COPYABLE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_COPYABLE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/contract/is_importance.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/contract/is_importance.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_IMPORTANCE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_IMPORTANCE_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_IMPORTANCE_importance (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_IMPORTANCE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_IMPORTANCE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/contract/is_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/contract/is_invariant.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_INVARIANT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_INVARIANT_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_INVARIANT_invariant (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_INVARIANT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_INVARIANT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/contract/is_postcondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/contract/is_postcondition.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_POSTCONDITION_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_POSTCONDITION_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_POSTCONDITION_postcondition (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_POSTCONDITION(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_POSTCONDITION_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/contract/is_precondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/contract/is_precondition.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_PRECONDITION_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_PRECONDITION_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_PRECONDITION_precondition (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_PRECONDITION(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_PRECONDITION_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_and.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_and.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_AND_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_AND_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_AND_and (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_AND(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_AND_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_and_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_and_eq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_AND_EQ_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_AND_EQ_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_AND_EQ_and_eq (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_AND_EQ(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_AND_EQ_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_asm.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_asm.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_ASM_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_ASM_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_ASM_asm (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_ASM(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_ASM_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_auto.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_auto.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_AUTO_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_AUTO_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF
+#define BOOST_DETAIL_PP_KEYWORD_AUTO_auto (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_AUTO(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_AUTO_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_bitand.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_bitand.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_BITAND_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_BITAND_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_BITAND_bitand (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_BITAND(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_BITAND_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_bitor.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_bitor.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_BITOR_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_BITOR_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_BITOR_bitor (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_BITOR(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_BITOR_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_bool.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_bool.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_BOOL_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_BOOL_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_BOOL_bool (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_BOOL(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_BOOL_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_break.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_break.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_BREAK_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_BREAK_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_BREAK_break (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_BREAK(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_BREAK_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_case.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_case.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_CASE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_CASE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_CASE_case (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_CASE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_CASE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_catch.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_catch.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_CATCH_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_CATCH_HPP_
+
+#include "check.hpp"
+
+// These are local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_CATCH_catch (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_CATCH(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_CATCH_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_char.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_char.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_CHAR_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_CHAR_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_CHAR_char (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_CHAR(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_CHAR_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_class.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_class.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_CLASS_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_CLASS_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_CLASS_class (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_CLASS(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_CLASS_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_compl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_compl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_COMPL_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_COMPL_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_COMPL_compl (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_COMPL(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_COMPL_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_const.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_const.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_CONST_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_CONST_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_CONST_const (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_CONST(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_CONST_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_const_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_const_cast.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_CONST_CAST_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_CONST_CAST_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_CONST_CAST_const_cast (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_CONST_CAST(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_CONST_CAST_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_continue.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_continue.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_CONTINUE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_CONTINUE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_CONTINUE_continue (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_CONTINUE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_CONTINUE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_default.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_default.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_DEFAULT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_DEFAULT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_DEFAULT_default (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_DEFAULT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_DEFAULT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_delete.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_delete.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_DELETE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_DELETE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_DELETE_delete (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_DELETE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_DELETE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_do.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_do.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_DO_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_DO_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_DO_do (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_DO(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_DO_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_double.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_double.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_DOUBLE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_DOUBLE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_DOUBLE_double (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_DOUBLE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_DOUBLE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_dynamic_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_dynamic_cast.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_DYNAMIC_CAST_dynamic_cast (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_DYNAMIC_CAST(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_DYNAMIC_CAST_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_else.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_else.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_ELSE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_ELSE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_ELSE_else (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_ELSE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_ELSE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_enum.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_enum.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_ENUM_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_ENUM_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_ENUM_enum (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_ENUM(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_ENUM_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_explicit.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_explicit.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_EXPLICIT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_EXPLICIT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_EXPLICIT_explicit (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_EXPLICIT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_EXPLICIT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_export.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_export.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_EXPORT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_EXPORT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_EXPORT_export (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_EXPORT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_EXPORT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_extern.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_extern.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_EXTERN_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_EXTERN_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_EXTERN_extern (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_EXTERN(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_EXTERN_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_false.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_false.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_FALSE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_FALSE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_FALSE_false (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_FALSE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_FALSE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_float.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_float.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_FLOAT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_FLOAT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_FLOAT_float (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_FLOAT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_FLOAT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_for.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_for.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_FOR_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_FOR_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_FOR_for (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_FOR(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_FOR_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_friend.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_friend.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_FRIEND_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_FRIEND_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_FRIEND_friend (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_FRIEND(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_FRIEND_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_goto.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_goto.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_GOTO_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_GOTO_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_GOTO_goto (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_GOTO(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_GOTO_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_if.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_if.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_IF_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_IF_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_IF_if (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_IF(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_IF_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_inline.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_inline.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_INLINE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_INLINE_HPP_
+
+#include "check.hpp"
+
+// These are not loacl macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_INLINE_inline (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_INLINE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_INLINE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_int.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_int.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_INT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_INT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_INT_int (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_INT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_INT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_long.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_long.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_LONG_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_LONG_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_LONG_long (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_LONG(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_LONG_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_mutable.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_mutable.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_MUTABLE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_MUTABLE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_MUTABLE_mutable (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_MUTABLE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_MUTABLE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_namespace.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_namespace.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_NAMESPACE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_NAMESPACE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_NAMESPACE_namespace (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_NAMESPACE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_NAMESPACE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_new.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_new.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_NEW_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_NEW_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_NEW_new (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_NEW(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_NEW_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_not.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_not.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_NOT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_NOT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_NOT_not (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_NOT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_NOT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_not_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_not_eq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_NOT_EQ_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_NOT_EQ_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_NOT_EQ_not_eq (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_NOT_EQ(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_NOT_EQ_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_operator.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_operator.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_OPERATOR_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_OPERATOR_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_OPERATOR_operator (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_OPERATOR(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_OPERATOR_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_or.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_or.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_OR_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_OR_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_OR_or (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_OR(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_OR_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_or_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_or_eq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_OR_EQ_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_OR_EQ_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_OR_EQ_or_eq (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_OR_EQ(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_OR_EQ_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_private.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_private.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_PRIVATE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_PRIVATE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_PRIVATE_private (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_PRIVATE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_PRIVATE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_protected.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_protected.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_PROTECTED_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_PROTECTED_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_PROTECTED_protected (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_PROTECTED(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_PROTECTED_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_public.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_public.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_PUBLIC_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_PUBLIC_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_PUBLIC_public (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_PUBLIC(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_PUBLIC_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_register.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_register.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_REGISTER_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_REGISTER_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_REGISTER_register (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_REGISTER(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_REGISTER_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_reinterpret_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_reinterpret_cast.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_REINTERPRET_CAST_reinterpret_cast (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_REINTERPRET_CAST(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_REINTERPRET_CAST_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_return.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_return.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_RETURN_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_RETURN_HPP_
+
+#include "check.hpp"
+
+// These are not loacl macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_RETURN_return (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_RETURN(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_RETURN_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_short.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_short.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_SHORT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_SHORT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_SHORT_short (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_SHORT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_SHORT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_signed.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_signed.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_SIGNED_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_SIGNED_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_SIGNED_signed (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_SIGNED(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_SIGNED_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_sizeof.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_sizeof.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_SIZEOF_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_SIZEOF_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_SIZEOF_sizeof (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_SIZEOF(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_SIZEOF_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_static.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_static.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_STATIC_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_STATIC_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_STATIC_static (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_STATIC(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_STATIC_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_static_cast.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_static_cast.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_STATIC_CAST_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_STATIC_CAST_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_STATIC_CAST_static_cast (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_STATIC_CAST(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_STATIC_CAST_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_struct.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_struct.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_STRUCT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_STRUCT_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_STRUCT_struct (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_STRUCT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_STRUCT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_switch.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_switch.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_SWITCH_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_SWITCH_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_SWITCH_switch (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_SWITCH(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_SWITCH_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_template.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_template.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_TEMPLATE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_TEMPLATE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_TEMPLATE_template (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_TEMPLATE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_TEMPLATE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_this.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_this.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,26 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_THIS_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_THIS_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_THIS_this (1)
+#define this_BOOST_DETAIL_PP_KEYWORD_THIS (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_THIS(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_THIS_)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_TRAILING_THIS(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_BACK(tokens, \
+ _BOOST_DETAIL_PP_KEYWORD_THIS)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_throw.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_throw.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_THROW_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_THROW_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_THROW_throw (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_THROW(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_THROW_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_true.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_true.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_TRUE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_TRUE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_TRUE_true (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_TRUE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_TRUE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_try.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_try.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_TRY_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_TRY_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_TRY_try (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_TRY(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_TRY_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_typedef.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_typedef.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_TYPEDEF_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_TYPEDEF_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_TYPEDEF_typedef (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_TYPEDEF(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_TYPEDEF_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_typeid.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_typeid.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_TYPEID_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_TYPEID_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_TYPEID_typeid (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_TYPEID(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_TYPEID_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_typename.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_typename.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_TYPENAME_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_TYPENAME_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_TYPENAME_typename (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_TYPENAME(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_TYPENAME_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_union.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_union.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_UNION_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_UNION_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_UNION_union (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_UNION(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_UNION_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_unsigned.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_unsigned.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_UNSIGNED_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_UNSIGNED_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_UNSIGNED_unsigned (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_UNSIGNED(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_UNSIGNED_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_using.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_using.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_USING_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_USING_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_USING_using (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_USING(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_USING_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_virtual.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_virtual.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_VIRTUAL_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_VIRTUAL_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_VIRTUAL_virtual (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_VIRTUAL(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_VIRTUAL_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_void.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_void.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_VOID_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_VOID_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_VOID_void (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_VOID(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_VOID_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_volatile.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_volatile.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_VOLATILE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_VOLATILE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_VOLATILE_volatile (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_VOLATILE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_VOLATILE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_wchar_t.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_wchar_t.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_WCHAR_T_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_WCHAR_T_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_WCHAR_T_wchar_t (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_WCHAR_T(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_WCHAR_T_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_while.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_while.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_WHILE_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_WHILE_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_WHILE_while (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_WHILE(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_WHILE_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_xor.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_xor.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_XOR_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_XOR_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_XOR_xor (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_XOR(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_XOR_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/is_xor_eq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/is_xor_eq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_XOR_EQ_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_XOR_EQ_HPP_
+
+#include "check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_XOR_EQ_xor_eq (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_XOR_EQ(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_XOR_EQ_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/parameter/is_deduced.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/parameter/is_deduced.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_DEDUCED_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_DECUCED_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_DEDUCED_deduced (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_DEDUCED(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_DEDUCED_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/parameter/is_in.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/parameter/is_in.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_IN_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_IN_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_IN_in (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_IN(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_IN_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/parameter/is_inout.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/parameter/is_inout.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_INOUT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_INOUT_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_INOUT_inout (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_INOUT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_INOUT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/keyword/parameter/is_out.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/keyword/parameter/is_out.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_KEYWORD_IS_OUT_HPP_
+#define BOOST_DETAIL_PP_KEYWORD_IS_OUT_HPP_
+
+#include "../check.hpp"
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_DETAIL_PP_KEYWORD_OUT_out (1)
+
+#define BOOST_DETAIL_PP_KEYWORD_IS_OUT(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_DETAIL_PP_KEYWORD_OUT_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/nilseq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/nilseq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,110 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_NILSEQ_HPP_
+#define BOOST_DETAIL_PP_NILSEQ_HPP_
+
+#include <boost/preprocessor/seq.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+// Utilities to handle sequences starting with `(NIL)` (to support empty seq):
+// nilseq := (BOOST_PP_NIL) [(elem0) (elem1) ...]
+
+// NOTE: `BOOST_PP_LIST` serves a similar purpose but it could not be used in
+// order to reuse signature parsing code. For example, parsed parameters are
+// represented as NILSEQ so parsers code used to parse sign sequence (wich
+// operate on SEQ) can be reused. Similarly, for initializers, concepts, etc.
+
+#define BOOST_DETAIL_PP_NILSEQ_SIZE(nilseq) \
+ BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(nilseq)) /* DEC for leading `(NIL)` */
+
+#define BOOST_DETAIL_PP_NILSEQ_IS_NIL(nilseq) \
+ BOOST_PP_EQUAL(BOOST_DETAIL_PP_NILSEQ_SIZE(nilseq), 0)
+
+// Assume nilseq is not NIL and removes leading `(NIL)`.
+#define BOOST_DETAIL_PP_NILSEQ_TO_SEQ(nilseq) \
+ BOOST_PP_SEQ_TAIL(nilseq)
+
+#define BOOST_DETAIL_PP_NILSEQ_ELEM(n, nilseq) \
+ BOOST_PP_SEQ_ELEM(BOOST_PP_INC(n), nilseq) /* INC for leading `(NIL)` */
+
+// FOR_EACH_I //
+
+#define BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I_(op, data, nilseq) \
+ /* got here iif nilseq size not nil, TAIL removes leading `(NIL)` */ \
+ BOOST_PP_SEQ_FOR_EACH_I(op, data, BOOST_DETAIL_PP_NILSEQ_TO_SEQ(nilseq))
+
+#define BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I(op, data, nilseq) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_NILSEQ_IS_NIL(nilseq), \
+ BOOST_PP_TUPLE_EAT(3) \
+ , \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I_ \
+ )(op, data, nilseq)
+
+// FIND //
+
+// Increments `index`.
+#define BOOST_DETAIL_PP_NILSEQ_FIND_O_(d, index_nilseq_check) \
+ ( \
+ BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(3, 0, index_nilseq_check)) \
+ , \
+ BOOST_PP_TUPLE_ELEM(3, 1, index_nilseq_check) \
+ , \
+ BOOST_PP_TUPLE_ELEM(3, 2, index_nilseq_check) \
+ )
+
+// Assume `index` within `nilseq` range and expand to
+// `check_macro(PP_SEQ_ELEM(index, nilseq))`.
+#define BOOST_DETAIL_PP_NILSEQ_FIND_P_CHECK_NOT_(d, index_nilseq_check) \
+ BOOST_PP_NOT( /* quit while-loop if `check_macro(elem)` is true */ \
+ BOOST_PP_TUPLE_ELEM(3, 2, index_nilseq_check)( /* `check_macro(elem)` */ \
+ BOOST_PP_SEQ_ELEM(BOOST_PP_TUPLE_ELEM(3, 0, index_nilseq_check), \
+ BOOST_PP_TUPLE_ELEM(3, 1, index_nilseq_check)) \
+ )) \
+
+#define BOOST_DETAIL_PP_NILSEQ_FIND_P_(d, index_nilseq_check) \
+ BOOST_PP_EXPAND( /* for proper macro expansion on MSVC */ \
+ BOOST_PP_IIF(BOOST_PP_LESS(BOOST_PP_TUPLE_ELEM(3, 0, index_nilseq_check), \
+ BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(3, 1, index_nilseq_check))), \
+ BOOST_DETAIL_PP_NILSEQ_FIND_P_CHECK_NOT_ \
+ , \
+ 0 /* quit while-loop because out of range */ \
+ BOOST_PP_TUPLE_EAT(2) \
+ )(d, index_nilseq_check) )
+
+// Expand to `(index, nilseq, check)` where index is the one of the 1st elem in
+// nil-seq for which `check(elem)` is true -- index is 0 if no match.
+#define BOOST_DETAIL_PP_NILSEQ_FIND_INDEX_(nilseq, check_macro) \
+ BOOST_PP_TUPLE_ELEM(3, 0, \
+ BOOST_PP_WHILE(BOOST_DETAIL_PP_NILSEQ_FIND_P_, \
+ BOOST_DETAIL_PP_NILSEQ_FIND_O_, \
+ (1 /* index */, nilseq, check_macro) ))
+
+#define BOOST_DETAIL_PP_NILSEQ_FIND_(nilseq, found_index) \
+ BOOST_PP_EXPAND( /* for proper macro expansion on MSVC */ \
+ BOOST_PP_IIF(BOOST_PP_LESS(found_index, BOOST_PP_SEQ_SIZE(nilseq)), \
+ found_index /* found within range (or not found 0) */ \
+ , \
+ 0 /* not found */ \
+ ))
+
+// Expand to index of 1st elem in nilseq for which `check_macro(elem)` is true,
+// or to 0 if `check_macro(elem)` is false for all nilseq elems.
+#define BOOST_DETAIL_PP_NILSEQ_FIND(nilseq, check_macro) \
+ BOOST_DETAIL_PP_NILSEQ_FIND_(nilseq, \
+ BOOST_DETAIL_PP_NILSEQ_FIND_INDEX_(nilseq, check_macro))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/nonempty_is_xxx.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/nonempty_is_xxx.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_NONEMPTY_IS_XXX_HPP_
+#define BOOST_DETAIL_PP_NONEMPTY_IS_XXX_HPP_
+
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+// Must use extra macro to avoid passign empty macro param.
+#define BOOST_DETAIL_PP_NONEMPTY_IS_XXX_(tokens, get_macro, is_xxx_macro) \
+ is_xxx_macro(get_macro(tokens))
+
+// If `get(tokens) != PP_EMPTY` && `is_xxx(get(tokens))` then 1, else 0.
+#define BOOST_DETAIL_PP_NONEMPTY_IS_XXX(tokens, get_macro, is_xxx_macro) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(get_macro(tokens)), \
+ 0 /* empty so expand to false */ \
+ BOOST_PP_TUPLE_EAT(3) \
+ , \
+ BOOST_DETAIL_PP_NONEMPTY_IS_XXX_ /* non-empty so check if xxx */ \
+ )(tokens, get_macro, is_xxx_macro)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/range.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/range.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,23 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_RANGE_HPP_
+#define BOOST_DETAIL_PP_RANGE_HPP_
+
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/comparison/greater_equal.hpp>
+#include <boost/preprocessor/comparison/less_equal.hpp>
+
+// Expand to 1 iff `min <= value <= max` (equality included).
+#define BOOST_DETAIL_PP_RANGE_IN(min, max, value) \
+ BOOST_PP_AND( \
+ BOOST_PP_GREATER_EQUAL(value, min) \
+ , BOOST_PP_LESS_EQUAL(value, max) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/seq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/seq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SEQ_HPP_
+#define BOOST_DETAIL_PP_SEQ_HPP_
+
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/first_n.hpp>
+#include <boost/preprocessor/seq/to_tuple.hpp>
+#include <boost/preprocessor/seq/rest_n.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+
+// Sequence manipulation in addition to Boost.Preprocessor ones.
+
+// Return element in the back.
+#define BOOST_DETAIL_PP_SEQ_BACK(seq) \
+ BOOST_PP_SEQ_ELEM(BOOST_PP_SUB(BOOST_PP_SEQ_SIZE(seq), 1), seq)
+
+// Return all elems but last: `(elem0) (elem1) ... (elem<N-2>)`.
+#define BOOST_DETAIL_PP_SEQ_LEAD(seq) \
+ BOOST_PP_SEQ_FIRST_N(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), seq)
+
+// PARENTHESIZE //
+
+#define BOOST_DETAIL_PP_SEQ_PARANTHESIZE_ELEM_(s, paren_seq, elem) \
+ paren_seq /* seq concat */ ((elem)) /* add extra parenthesis */
+
+// Used by some (Boost) code to handle commas within macro parameters.
+#define BOOST_DETAIL_PP_SEQ_PARENTHESIZE_S(s, seq) \
+ BOOST_PP_SEQ_TAIL( /* remove extra ((PP_EMPTY)) */ \
+ BOOST_PP_SEQ_FOLD_LEFT_ ## s( \
+ BOOST_DETAIL_PP_SEQ_PARANTHESIZE_ELEM_, \
+ ((BOOST_PP_EMPTY)), /* handle empty macro arg */ \
+ seq))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/access.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/access.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,57 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_ACCESS_HPP_
+#define BOOST_DETAIL_PP_SIGN_ACCESS_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/keyword/is_public.hpp>
+#include <boost/detail/preprocessor/keyword/is_protected.hpp>
+#include <boost/detail/preprocessor/keyword/is_private.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// Access.
+
+#define BOOST_DETAIL_PP_SIGN_ACCESS(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ACCESS_INDEX, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_HAS_ACCESS(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_ACCESS(sign)))
+
+// Public, protected, or private.
+
+#define BOOST_DETAIL_PP_SIGN_ACCESS_IS_NOTEMPTY_(sign, is_macro) \
+ is_macro(BOOST_DETAIL_PP_SIGN_ACCESS(sign))
+
+#define BOOST_DETAIL_PP_SIGN_ACCESS_IS_(sign, is_macro) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_HAS_ACCESS(sign), \
+ BOOST_DETAIL_PP_SIGN_ACCESS_IS_NOTEMPTY_ \
+ , \
+ 0 /* false when no access (empty) */ \
+ BOOST_PP_TUPLE_EAT(2) \
+ )(sign, is_macro)
+
+#define BOOST_DETAIL_PP_SIGN_IS_PUBLIC(sign) \
+ BOOST_DETAIL_PP_SIGN_ACCESS_IS_(sign, \
+ BOOST_DETAIL_PP_KEYWORD_IS_PUBLIC)
+
+#define BOOST_DETAIL_PP_SIGN_IS_PROTECTED(sign) \
+ BOOST_DETAIL_PP_SIGN_ACCESS_IS_(sign, \
+ BOOST_DETAIL_PP_KEYWORD_IS_PROTECTED)
+
+#define BOOST_DETAIL_PP_SIGN_IS_PRIVATE(sign) \
+ BOOST_DETAIL_PP_SIGN_ACCESS_IS_(sign, \
+ BOOST_DETAIL_PP_KEYWORD_IS_PRIVATE)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/class_base_indexes.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/class_base_indexes.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,17 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_BASE_INDEXES_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_BASE_INDEXES_HPP_
+
+// Bases are nil-seq of 2-tuples: `(NIL) { ( (access_level, base_type) ) }*`.
+#define BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASE_ACCESS_INDEX 0
+#define BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASE_TYPE_INDEX 1
+#define BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASE_INDEX_MAX 2
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/param_indexes.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/param_indexes.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,28 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEXES_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEXES_HPP_
+
+// PARAM STRUCTURE
+// A parameter is a 5-tuple: (classifier, qualifier, type, name, default)
+// * Classifier can be `in`/`out`/`inout` or `auto`/`register` or `PP_EMPTY`.
+// * Qualifier can be `copyable` or `PP_EMPTY`.
+// * Type can be anything but `PP_EMPTY` -- `auto` or `requires(PREDICATE)` for
+// named parameter "any type" or PREDICATE metafunction type match.
+// * Name can be anything but `PP_EMPTY`.
+// * Default can be anything or `PP_EMPTY`.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAM_CLASSIFIER_INDEX 0
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAM_QUALIFIER_INDEX 1
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAM_TYPE_INDEX 2
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAM_NAME_INDEX 3
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAM_DEFAULT_INDEX 4
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEX_MAX 5
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/params_indexes.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/params_indexes.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,32 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDEXES_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDEXES_HPP_
+
+// Params are represented as 3-array `(3, (tag_namespace, induced, deduced))`
+// where:
+// * `tag_namespace` is `EMPTY` for no tag (not named params), `EMPTY EMPTY`
+// for named params default tag, and `token EMPTY` for token as named params
+// tag.
+// * `induced` are the induced parameters (named or not) as a sequence of NIL
+// and 5-tuples `(NIL) {( ([classifier] EMPTY, [qualifier] EMPTY, type, name,
+// [default] EMPTY) )}*.
+// * `deduced` are the deduced parameters (named only) as a sequence of NIL and
+// 5-tuples same as the induced params.
+// For function parameters: All the above are possible.
+// For template parameters: `tag_namespace` is always `EMPTY`, `deduced` is
+// always `(NIL)`, `induced` contains the template parameters for which
+// `classifer` and `qualifier` are always `EMPTY`.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAMS_TAG_INDEX 0
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDUCED_INDEX 1
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAMS_DEDUCED_INDEX 2
+#define BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDEX_MAX 3
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_HPP_
+
+#include "param_/copyable.hpp"
+#include "../return.hpp"
+#include "../../../parser/seq.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// n is number of param being parsed 1, 2, ... (used for error reporting).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM(seq_sign_err, n, \
+ storage01, named01, template01) \
+ /* named: min size 4 = (io-qual) (type) (name) ... (PP_NIL) */ \
+ /* pos: min size 3 = (type) (name) ... (PP_NIL) */ \
+ BOOST_PP_IIF(BOOST_PP_LESS(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), \
+ BOOST_PP_ADD(3, named01) /* 3 (pos) or 4 (named) */), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_IIF(named01, \
+ BOOST_PP_CAT(ERROR_missing_io_classifier_or_type_or_name_for_named_parameter_, n) \
+ , BOOST_PP_IIF(template01, \
+ BOOST_PP_CAT(ERROR_missing_type_identifier_or_name_for_template_parameter_, n) \
+ , \
+ BOOST_PP_CAT(ERROR_missing_type_or_name_for_positional_parameter_, n) \
+ )) \
+ ) \
+ BOOST_PP_TUPLE_EAT(5) \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_MAYBE_COPYABLE \
+ )(seq_sign_err, n, storage01, named01, template01)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/copyable.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/copyable.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,73 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_COPYABLE_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_COPYABLE_HPP_
+
+#include "opt_req.hpp"
+#include "../../../parse/return.hpp"
+#include "../../../../parser/seq.hpp"
+#include <boost/detail/preprocessor/keyword/contract/is_copyable.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_COPYABLE_(seq_sign_err, n, \
+ storage01, named01, template01) \
+ /* if got here, template01 is 0 because tparam cannot be (copyable) */ \
+ /* named: min size 5 = (io-qual) (copyable) (type) (name) ... (PP_NIL) */ \
+ /* pos: min size 4 = (copyable) (type) (name) ... (PP_NIL) */ \
+ BOOST_PP_IIF(BOOST_PP_LESS( \
+ BOOST_PP_SEQ_SIZE(BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ seq_sign_err)), \
+ /* add expands to 4 (pos) or 5 (named) */ \
+ BOOST_PP_ADD(4, BOOST_PP_OR(storage01, named01))), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_IIF(named01, \
+ BOOST_PP_CAT(ERROR_missing_io_classifier_or_type_or_name_for_copyable_named_parameter_, n) \
+ , BOOST_PP_IIF(storage01, \
+ BOOST_PP_CAT(ERROR_missing_storage_classifier_or_type_or_name_for_copyable_positional_parameter_, n) \
+ , \
+ BOOST_PP_CAT(ERROR_missing_type_or_name_for_copyable_positional_parameter_, n) \
+ )) \
+ ) \
+ BOOST_PP_TUPLE_EAT(6) \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_OPT_OR_REQ \
+ )(seq_sign_err, n, storage01, named01, template01, 1 /* copyable */)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_NONCOPYABLE_(seq_sign_err, n, \
+ storage01, named01, template01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_OPT_OR_REQ(seq_sign_err, n, \
+ storage01, named01, template01, 0 /* non-copyable */)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_MAYBE_COPYABLE( \
+ seq_sign_err, n, storage01, named01, template01) \
+ /* named: size > 3/2, check if 2nd elem is (copyable) */ \
+ /* pos: size > 2/1, check if 1st elem is (copyable) */ \
+ BOOST_PP_IIF( \
+ BOOST_PP_AND( \
+ BOOST_PP_NOT(template01) \
+ /* tparam always parsed as non-copyable */ \
+ , BOOST_DETAIL_PP_KEYWORD_IS_COPYABLE(BOOST_PP_SEQ_ELEM( \
+ /* add expands to 0/1 (pos) or 1/2 (named) */ \
+ BOOST_PP_ADD(0, BOOST_PP_OR(storage01, named01)), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err))) \
+ ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_COPYABLE_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_NONCOPYABLE_ \
+ )(seq_sign_err, n, storage01, named01, template01)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/is_classified.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/is_classified.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,36 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_CLASSIFIED_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_CLASSIFIED_HPP_
+
+#include <boost/detail/preprocessor/keyword/parameter/is_in.hpp>
+#include <boost/detail/preprocessor/keyword/parameter/is_out.hpp>
+#include <boost/detail/preprocessor/keyword/parameter/is_inout.hpp>
+#include <boost/detail/preprocessor/keyword/is_register.hpp>
+#include <boost/detail/preprocessor/keyword/is_auto.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+
+// I/O classified by in/out/inout (named params only).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_IO_TOKEN(token) \
+ BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_IN(token) \
+ , BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_OUT(token) \
+ , BOOST_DETAIL_PP_KEYWORD_IS_INOUT(token) \
+ ) \
+ )
+
+// Storage classified by auto/register (positional params only).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_STORAGE_TOKEN(token) \
+ BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_REGISTER(token) \
+ , BOOST_DETAIL_PP_KEYWORD_IS_AUTO(token) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/opt_req.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/opt_req.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,68 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPTREQ_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPTREQ_HPP_
+
+#include "single.hpp"
+#include "../../../parse/return.hpp"
+#include "../../../../parser/seq.hpp"
+#include <boost/detail/preprocessor/keyword/is_default.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_OPTIONAL_(seq_sign_err, n, \
+ storage01, named01, template01, copyable01) \
+ /* named: size 6= (io-qual) (copyable)(type) (name) (def)(val) (PP_NIL) */ \
+ /* pos: size 5= [storage] (copyable)(type) (name) (def)(val) (PP_NIL) */ \
+ BOOST_PP_IIF(BOOST_PP_LESS( \
+ BOOST_PP_SEQ_SIZE(BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ seq_sign_err)), \
+ /* err: size < 5 (pos) / 6 (pos-copy or named) / 7 (named-copy) */ \
+ BOOST_PP_ADD(BOOST_PP_ADD(5, BOOST_PP_OR(named01, storage01)), \
+ copyable01)), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_IIF(named01, \
+ BOOST_PP_CAT(ERROR_missing_default_value_for_named_parameter_, n) \
+ , BOOST_PP_IIF(template01, \
+ BOOST_PP_CAT(ERROR_missing_default_value_for_template_parameter_, n) \
+ , /* give same error regardless of storage classifier */ \
+ BOOST_PP_CAT(ERROR_missing_default_value_for_positional_parameter_, n) \
+ )) \
+ ) \
+ BOOST_PP_TUPLE_EAT(7) \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE \
+ )(seq_sign_err, n, \
+ storage01, named01, template01, copyable01, 1 /* has default */)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_REQUIRED_(seq_sign_err, n, \
+ storage01, named01, template01, copyable01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE(seq_sign_err, n, \
+ storage01, named01, template01, copyable01, 0 /* no default */)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_OPT_OR_REQ(seq_sign_err, n, \
+ storage01, named01, template01, copyable01) \
+ /* named: size > 3/4, check is 3rd/4th elem is (default) */ \
+ /* pos: size > 2/3, check is 2nd/3rd elem is (default) */ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_KEYWORD_IS_DEFAULT(BOOST_PP_SEQ_ELEM( \
+ /* index is 3 (pos) / 4 (pos-copy or named) / 5 (named-copy) */ \
+ BOOST_PP_ADD(BOOST_PP_ADD(2, BOOST_PP_OR(named01, storage01)), \
+ copyable01), BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err))), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_OPTIONAL_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_REQUIRED_ \
+ )(seq_sign_err, n, storage01, named01, template01, copyable01)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/single.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/param_/single.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,156 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_HPP_
+
+#include "is_classified.hpp"
+#include "../../../parse/return.hpp"
+#include "../../../../parser/seq.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/comparison/less.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/rest_n.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_DEFAULT_( \
+ seq_sign_err, n, classified01, template01, copyable01) \
+ BOOST_PP_SEQ_ELEM( \
+ BOOST_PP_ADD(BOOST_PP_ADD(3, classified01), copyable01), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_(seq_sign_err, n, \
+ classified01, template01, copyable01, default01) \
+ /* named: size >= 6/7 or 4/5 (last might be PP_NIL) */ \
+ /* post: size >= 5/6 or 3/4 (last might be PP_NIL) +1 if classified */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_OK(seq_sign_err, \
+ ( /* io or auto/register classifier (optional for pos-params) */ \
+ BOOST_PP_IIF(classified01, \
+ BOOST_PP_SEQ_ELEM \
+ , \
+ BOOST_PP_TUPLE_EAT(2) \
+ )(0, BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err))\
+ BOOST_PP_EMPTY /* (for optional) */ \
+ , /* copyable (optional) */ \
+ BOOST_PP_EXPR_IF(copyable01, copyable) \
+ BOOST_PP_EMPTY /* (for optional) */ \
+ , /* type */ \
+ BOOST_PP_SEQ_ELEM(BOOST_PP_ADD(BOOST_PP_ADD( \
+ 0, classified01), copyable01), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)) \
+ , /* name */ \
+ BOOST_PP_SEQ_ELEM(BOOST_PP_ADD(BOOST_PP_ADD( \
+ 1, classified01), copyable01), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)) \
+ , /* default value (optional) */ \
+ BOOST_PP_IIF(default01, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_DEFAULT_ \
+ , \
+ BOOST_PP_TUPLE_EAT(5) \
+ )(seq_sign_err, n, classified01, template01, copyable01) \
+ BOOST_PP_EMPTY /* (for optional) */ \
+ ), \
+ BOOST_PP_SEQ_REST_N( \
+ BOOST_PP_ADD(BOOST_PP_ADD(BOOST_PP_ADD( \
+ 2, classified01), copyable01), \
+ BOOST_PP_IIF(default01, \
+ 2 /* skip both (default)(val) */ \
+ , \
+ 0 /* no default, skip nothing */ \
+ ) \
+ ), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ ) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_OK_(seq_sign_err, n, \
+ storage01, named01, template01, copyable01, default01) \
+ /* classified either by storage (auto/register) or i/o (in/out/inout) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_(seq_sign_err, n, \
+ BOOST_PP_OR(storage01, named01), template01, copyable01, default01)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_STORAGE_UNEXPECTED_ERR_( \
+ seq_sign_err, n, \
+ storage01, named01, template01, copyable01, default01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_CAT(ERROR_unexpected_strorage_classifier_for_parameter_, n))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_STORAGE_EXPECTED_ERR_( \
+ seq_sign_err, n, \
+ storage01, named01, template01, copyable01, default01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_CAT(ERROR_missing_storage_classifier_for_parameter_, n))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_IO_UNEXPECTED_ERR_( \
+ seq_sign_err, n, \
+ storage01, named01, template01, copyable01, default01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_CAT(ERROR_specified_io_classifier_for_non_named_parameter_, n))
+
+#define CONTRACT__PP_SIGN_AUX_PARSE_PARAM_SINGLE_IO_EXPECTED_ERR_( \
+ seq_sign_err, n, \
+ storage01, named01, template01, copyable01, default01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_CAT(ERROR_missing_io_classifier_for_named_parameter_, n))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE(seq_sign_err, n, \
+ storage01, named01, template01, copyable01, default01) \
+ BOOST_PP_IIF( \
+ BOOST_PP_AND( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_IO_TOKEN( \
+ BOOST_PP_SEQ_ELEM( \
+ BOOST_PP_ADD(BOOST_PP_ADD(0, named01), \
+ copyable01), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ seq_sign_err))) \
+ , BOOST_PP_NOT(named01) \
+ ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_IO_UNEXPECTED_ERR_ \
+ , BOOST_PP_IIF( \
+ BOOST_PP_AND( \
+ named01 \
+ , BOOST_PP_NOT( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_IO_TOKEN( \
+ BOOST_PP_SEQ_ELEM(0, \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ seq_sign_err)))) \
+ ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_IO_EXPECTED_ERR_ \
+ , BOOST_PP_IIF( \
+ BOOST_PP_AND( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_STORAGE_TOKEN( \
+ BOOST_PP_SEQ_ELEM( \
+ BOOST_PP_ADD(BOOST_PP_ADD(0, storage01), \
+ copyable01), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ seq_sign_err))) \
+ , BOOST_PP_NOT(storage01) \
+ ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_STORAGE_UNEXPECTED_ERR_\
+ , BOOST_PP_IIF( \
+ BOOST_PP_AND( \
+ storage01 \
+ , BOOST_PP_NOT( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_STORAGE_TOKEN(\
+ BOOST_PP_SEQ_ELEM(0, \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ seq_sign_err)))) \
+ ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_STORAGE_EXPECTED_ERR_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_SINGLE_OK_ \
+ ))))(seq_sign_err, n, \
+ storage01, named01, template01, copyable01, default01)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,86 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_HPP_
+
+#include "params_/named.hpp"
+#include "params_/positional.hpp"
+#include "../apply.hpp"
+#include "../return.hpp"
+#include "../../parser/sign_nil.hpp"
+#include "../../parser/seq_next.hpp"
+#include "../../parser/seq_skip.hpp"
+#include "../../../parser/seq.hpp"
+#include "../../../parse/start.hpp"
+#include <boost/detail/preprocessor/keyword/is_void.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// Handle named or positional.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_OR_POSITIONAL_D_( \
+ d, seq_sign_err) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_IS_NAMED_TOKEN( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_D \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_POSITIONAL_D \
+ )(d, seq_sign_err)
+
+// Handle empty `()` (C99 only).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_EMPTY_(seq_sign_err, d) \
+ /* no param to parse, append `EMPTY (NIL) (NIL) ` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL( \
+ seq_sign_err, \
+ BOOST_PP_EMPTY /* no tag namespace */ \
+ ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL /* no induced params */\
+ ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL /* no deduced params */ \
+ )
+
+// Handle (void).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_VOID_D_(d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_EMPTY_( \
+ /* skip `(void)` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP(seq_sign_err), d)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_HANDLE_VOID_(seq_sign_err, d) \
+ /* it is void iff 2-elem seq (token)(NIL) and token == void */\
+ BOOST_PP_IIF(BOOST_PP_AND( \
+ BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 2), \
+ BOOST_DETAIL_PP_KEYWORD_IS_VOID( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT( \
+ seq_sign_err))), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_VOID_D_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_OR_POSITIONAL_D_ \
+ )(d, seq_sign_err)
+
+// Parse params.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_D_(d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_HANDLE_VOID_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_EMPTY_, d)
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_D(d, seq) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_D_(d, \
+ BOOST_DETAIL_PP_SIGN_PARSE_START(seq))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS(seq) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_D(1, seq)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/all.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/all.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,69 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_HPP_
+
+#include "../../../parser/merge.hpp"
+#include "../../../parser/seq_next.hpp"
+#include "../../../parser/sign_nil.hpp"
+#include "../../../../parser/seq.hpp"
+#include "../../../../parser/sign.hpp"
+#include "../../../../parser/err.hpp"
+#include <boost/detail/preprocessor/keyword/parameter/is_deduced.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/control/while.hpp>
+
+// All params (while-loop).
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_P_(n, seq_sign_err) \
+ BOOST_PP_AND( \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err)) \
+ , BOOST_PP_AND( \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_KEYWORD_IS_DEDUCED( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT( \
+ seq_sign_err))) \
+ , BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 1) \
+ ) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_WHILE_D_( \
+ d, op_macro, seq_sign_err) \
+ BOOST_PP_WHILE_ ## d(BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_P_, \
+ op_macro, seq_sign_err)
+
+// Wraps params sign into a nil-seq `( seq, (NIL) (sign), err )`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_SIGNSEQ_(d, seq_sign_err) \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL /* handle empty seq */ \
+ ( BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err) ) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_D( \
+ d, op_macro, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE2(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_SIGNSEQ_(d, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_WHILE_D_(d, op_macro, \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ ) \
+ )))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/deduced.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/deduced.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,103 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_HPP_
+
+#include "all.hpp"
+#include "../../return.hpp"
+#include "../../apply_1.hpp" // To avoid reentrancy issues.
+#include "../../../parser/merge.hpp"
+#include "../../../parser/sign_nil.hpp"
+#include "../../../parser/seq_next.hpp"
+#include "../../../parser/seq_skip.hpp"
+#include "../../../../parse/start.hpp"
+#include <boost/detail/preprocessor/keyword/parameter/is_deduced.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// Deduced named params.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_NONE_OK_D_( \
+ d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_UNEXPECTED_ERR_D_( \
+ d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_unexpected_deduced_named_parameters)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_MISSING_ERR_D_( \
+ seq_sign_err, d) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_deduced_named_parameters)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_EMPTY_ERR_D_( \
+ seq_sign_err, d) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_specified_empty_deduced_named_parameters)
+
+// C99 only.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_MISSING_EMPTY_ERR_D_( \
+ d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_empty_deduced_named_parameters)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_ALL_D_( \
+ d, seq_sign_err) \
+ /* take only 2nd elem because 1st is NIL */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE2(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_D(d, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_O_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_NOEMPTY( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err), \
+ ERROR_missing_deduced_parameters) \
+ ))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_IF_EMPTY_D_( \
+ seq_sign_err, d) \
+ BOOST_PP_IF(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_ALL_D_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_EMPTY_ERR_D_ \
+ )(d, seq_sign_err)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_YES_D_( \
+ d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_1( \
+ /* skip (deduced) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_IF_EMPTY_D_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_MISSING_ERR_D_, \
+ d)
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_NO(seq_sign_err) \
+ /* next could be PP_NIL, or just not (deduced) */ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_KEYWORD_IS_DEDUCED( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_UNEXPECTED_ERR_D_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_NONE_OK_D_ \
+ )(0, seq_sign_err)
+
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_D(d, seq_sign_err) \
+ /* next could be PP_NIL, or just not (deduced) */ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_KEYWORD_IS_DEDUCED( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_YES_D_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_NONE_OK_D_ \
+ )(d, seq_sign_err)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/named.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/named.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,50 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_HPP_
+
+#include "deduced.hpp"
+#include "all.hpp"
+#include "tag_namespace.hpp"
+#include "../param_.hpp"
+#include "../param_/is_classified.hpp"
+#include <boost/detail/preprocessor/keyword/parameter/is_deduced.hpp>
+#include <boost/detail/preprocessor/keyword/is_namespace.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+
+// Named params.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_O_(d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM(seq_sign_err, BOOST_PP_DEC(d), \
+ 0, /* named do not support auto/register storage classifiers */ \
+ 1, /* named */ \
+ 0 /* no template param */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_D(d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_D(d, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_D(d, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_NAMED_O_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE( \
+ seq_sign_err \
+ ) \
+ ))
+
+// Is named token (no seq_sign_err).
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_IS_NAMED_TOKEN(token) \
+ BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_NAMESPACE(token) \
+ , BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_DEDUCED(token) \
+ , BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_IO_TOKEN(token) \
+ ) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/positional.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/positional.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,38 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_POSITIONAL_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_POSITIONAL_HPP_
+
+#include "deduced.hpp"
+#include "tag_namespace.hpp"
+#include "../param_.hpp"
+#include "../param_/is_classified.hpp"
+#include <boost/preprocessor/arithmetic/dec.hpp>
+
+// Positional params (it is a positional param if it is not a named one).
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_POSITIONAL_O_( \
+ d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM(seq_sign_err, BOOST_PP_DEC(d), \
+ /* if storage classified by auto/register */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM_IS_STORAGE_TOKEN( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)),\
+ 0, /* no named param */ \
+ 0 /* no template param */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_POSITIONAL_D(d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_DEDUCED_NO( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_D(d, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_POSITIONAL_O_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE_NOT( \
+ seq_sign_err \
+ ) \
+ ))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/tag_namespace.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/params_/tag_namespace.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE_HPP_
+
+#include "../../../parse/tagged_opt.hpp"
+#include "../../../parse/tagged_not.hpp"
+#include "../../../parse/return.hpp"
+#include <boost/detail/preprocessor/keyword/is_namespace.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE_ONEMPTY_( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_cannot_specify_an_empty_parameter_tag_namespace)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_APPEND_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_NAMESPACE, \
+ /* if no (namespace), Boost.Parameter default is `tag` */ \
+ BOOST_PP_EMPTY BOOST_PP_EMPTY, /* 2 PP_EMPTY for default */ \
+ /* handle (namespace)() empty seq (on C99) */ \
+ BOOST_PP_IS_EMPTY, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE_ONEMPTY_)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_TAG_NAMESPACE_NOT( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_NAMESPACE, \
+ BOOST_PP_EMPTY, /* 1 PP_EMPTY for none */ \
+ ERROR_unexpected_parameter_tag_namespace)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/tparams.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/all_params/tparams.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,58 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_HPP_
+
+#include "param_.hpp"
+#include "params_/deduced.hpp"
+#include "params_/tag_namespace.hpp"
+#include "../apply.hpp"
+#include "../return.hpp"
+#include "../../../parse/start.hpp"
+#include <boost/preprocessor/arithmetic/dec.hpp>
+
+// This code re-uses the function parameter parse macros.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_O_(d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAM(seq_sign_err, BOOST_PP_DEC(d), \
+ 0, /* tparam does not have auto/register storage classifiers */ \
+ 0, /* tparam is not named (positional) */ \
+ 1 /* template parameter */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_(seq_sign_err, d) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS_ALL_D(d, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_O_, \
+ /* Template params have no tag-namespace to parse by calling */ \
+ /* something like `PP_SIGN_PARSE_PARAMS_TAG_NAMESPACE_NOT()` */ \
+ seq_sign_err)
+
+// Handle empty `()` (C99 only).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_EMPTY_(seq_sign_err, d) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_specified_empty_template_parameters)
+
+// Parse params.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_D_(d, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_AUX_SIGN_PARSE_TPARAMS_, \
+ BOOST_DETAIL_PP_AUX_SIGN_PARSE_TPARAMS_EMPTY_, d)
+
+// Public API.
+
+// Template params as `( (NIL) { ((E, E, type, name, default-value E) }* )` so
+// just `( (NIL) )` if no template param.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_D(d, seq) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_D_(d, \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_NOEMPTY(seq, \
+ ERROR_missing_template_parameters))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS(seq) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TPARAMS_D(1, seq)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HPP_
+
+#include "return.hpp"
+#include "../../parser/seq.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// IMPORTANT: Code repeated in "apply_1.hpp", ... to avoid reentrancy issues.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_DEFAULT_ERR_( \
+ seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_tokens_from_sequence) /* default error */
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 1), \
+ op_macro \
+ , \
+ empty_macro /* empty if size <= 1 (because (PP_NIL) always there) */ \
+ )(seq_sign_err, data)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ seq_sign_err /* foward existing err */
+
+// Public API.
+
+// If err, forward err; If empty, `empty_macro(...)`; Else, `op_macro(...)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_ \
+ )(seq_sign_err, op_macro, empty_macro, data)
+
+// If err, forward err; If empty, default err; Else, `op_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY( \
+ seq_sign_err, op_macro, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY(seq_sign_err, op_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_DEFAULT_ERR_, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_1.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_1.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_1_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_1_HPP_
+
+#include "return.hpp"
+#include "../../parser/seq.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// IMPORTANT: Code repeated in "apply_1.hpp", ... to avoid reentrance issues.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_DEFAULT_ERR_1_( \
+ seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_tokens_from_sequence) /* default error */
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_1_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 1), \
+ op_macro \
+ , \
+ empty_macro /* empty if size <= 1 (because (PP_NIL) always there) */ \
+ )(seq_sign_err, data)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_1_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ seq_sign_err /* foward existing err */
+
+// Public API.
+
+// If err, forward err; If empty, `empty_macro(...)`; Else, `op_macro(...)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_1( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_1_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_1_ \
+ )(seq_sign_err, op_macro, empty_macro, data)
+
+// If err, forward err. If empty, default err. Else, `op_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_1( \
+ seq_sign_err, op_macro, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_1(seq_sign_err, op_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_DEFAULT_ERR_1_, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_2.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_2.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_2_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_2_HPP_
+
+#include "return.hpp"
+#include "../../parser/seq.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// IMPORTANT: Code repeated in "apply_1.hpp", ... to avoid reentrance issues.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_APPLY_DEFAULT_ERR_2_( \
+ seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_tokens_from_sequence) /* default error */
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_2_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 1), \
+ op_macro \
+ , \
+ empty_macro /* empty if size <= 1 (because (PP_NIL) always there) */ \
+ )(seq_sign_err, data)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_2_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ seq_sign_err /* foward existing err */
+
+// Public API.
+
+// If err, forward err; If empty, `empty_macro(...)`; Else, `op_macro(...)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_2( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_2_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_2_ \
+ )(seq_sign_err, op_macro, empty_macro, data)
+
+// If err, forward err; If empty, default err; Else, `op_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_2( \
+ seq_sign_err, op_macro, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_2(seq_sign_err, op_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_DEFAULT_ERR_2_, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_i_.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_i_.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_I_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_I_HPP_
+
+#include "return.hpp"
+#include "../../parser/seq.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// IMPORTANT: Code repeated in "apply_1.hpp", ... to avoid reentrance issues.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_APPLY_DEFAULT_ERR_I_( \
+ seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_tokens_from_sequence) /* default error */
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_I_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 1), \
+ op_macro \
+ , \
+ empty_macro /* empty if size <= 1 (because (PP_NIL) always there) */ \
+ )(seq_sign_err, data)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_I_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ seq_sign_err /* foward existing err */
+
+// Public API.
+
+// If err, forward err; If empty, `empty_macro(...)`; Else, `op_macro(...)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_I( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_I_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_I_ \
+ )(seq_sign_err, op_macro, empty_macro, data)
+
+// If err, forward err; If empty, default err; Else, `op_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_I( \
+ seq_sign_err, op_macro, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_I(seq_sign_err, op_macro, \
+ BOOST_DETAIL_PP_SIGN_PARSE_APPLY_DEFAULT_ERR_I_, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_ii_.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/apply_ii_.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_APPLY_II_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_APPLY_II_HPP_
+
+#include "return.hpp"
+#include "../../parser/seq.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// IMPORTANT: Code repeated in "apply_1.hpp", ... to avoid reentrance issues.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_DEFAULT_ERR_II_( \
+ seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_tokens_from_sequence) /* default error */
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_II_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 1), \
+ op_macro \
+ , \
+ empty_macro /* empty if size <= 1 (because (PP_NIL) always there) */ \
+ )(seq_sign_err, data)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_II_( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ seq_sign_err /* foward existing err */
+
+// Public API.
+
+// If err, forward err; If empty, `empty_macro(...)`; Else, `op_macro(...)`.
+#define BOOST_DETAIL_PP_SIGN_PARSE_APPLY_EMPTY_II( \
+ seq_sign_err, op_macro, empty_macro, data) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_FWD_ERR_II_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_HANDLE_EMPTY_II_ \
+ )(seq_sign_err, op_macro, empty_macro, data)
+
+// If err, forward err; If empty, default err; Else, `op_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_II( \
+ seq_sign_err, op_macro, data) \
+ BOOST_DETAIL_PP_SIGN_PARSER_APPLY_EMPTY_II(seq_sign_err, op_macro, \
+ BOOST_DETAIL_PP_SIGN_PARSER_APPLY_DEFAULT_ERR_II_, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/if.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/if.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,64 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_HPP_
+
+#include "apply_i_.hpp" // To avoid reentrance issues (only IF uses APPLY_I*).
+#include "return.hpp"
+#include "../parser/seq_next.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// IMPORTANT: Code repeated in "if_1.hpp", ... to avoid reentrance issues.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_DEFAULT_ERR_( \
+ seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_tokens_when_matching_sequence)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_PRESENT_( \
+ seq_sign_err, empty_check_then_else_data) \
+ BOOST_PP_IIF( /* check_macro( next(sse) ) */ \
+ BOOST_PP_TUPLE_ELEM(5, 1, empty_check_then_else_data) \
+ ( BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) ), \
+ BOOST_PP_TUPLE_ELEM(5, 2, empty_check_then_else_data) /* then_macro */ \
+ , \
+ BOOST_PP_TUPLE_ELEM(5, 3, empty_check_then_else_data) /* else_macro */ \
+ )(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(5, 4, empty_check_then_else_data) /* data */)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY_( \
+ seq_sign_err, empty_check_then_else_data) \
+ /* empty_macro(sse , data) */ \
+ BOOST_PP_TUPLE_ELEM(5, 0, empty_check_then_else_data) \
+ ( seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(5, 4, empty_check_then_else_data) /* data */ )
+
+// Public API.
+
+// If err, forward err; Else if empty, `empty_macro(sse, data)`;
+// Else if `check_macro(next(sse))`, `then_macro(sse, data)`;
+// Else `else_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY( \
+ seq_sign_err, empty_macro, check_macro, then_macro, else_macro, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_I(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_PRESENT_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY_, \
+ (empty_macro, check_macro, then_macro, else_macro, data) )
+
+// If err, forward error; Else if empty, default error;
+// Else if `check_macro(next(sse))`, `then_macro(sse, data)`;
+// Else `else_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF( \
+ seq_sign_err, check_macro, then_macro, else_macro, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_DEFAULT_ERR_, \
+ check_macro, then_macro, else_macro, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/if_1.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/if_1.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,64 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_1_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_1_HPP_
+
+#include "apply_ii_.hpp" // To avoid reentrance issues (only IF uses APPLY_I*).
+#include "return.hpp"
+#include "../parser/seq_next.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// IMPORTANT: Code repeated in "if_1.hpp", ... to avoid reentrance issues.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_DEFAULT_ERR_1_( \
+ seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_tokens_when_matching_sequence)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_PRESENT_1_( \
+ seq_sign_err, empty_check_then_else_data) \
+ BOOST_PP_IIF( /* check_macro( next(sse) ) */ \
+ BOOST_PP_TUPLE_ELEM(5, 1, empty_check_then_else_data) \
+ ( BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) ), \
+ BOOST_PP_TUPLE_ELEM(5, 2, empty_check_then_else_data) /* then_macro */ \
+ , \
+ BOOST_PP_TUPLE_ELEM(5, 3, empty_check_then_else_data) /* else_macro */ \
+ )(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(5, 4, empty_check_then_else_data) /* data */)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY_1_( \
+ seq_sign_err, empty_check_then_else_data) \
+ /*empty_macro(sse,data)*/ \
+ BOOST_PP_TUPLE_ELEM(5, 0, empty_check_then_else_data) \
+ ( seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(5, 4, empty_check_then_else_data) /* data */ )
+
+// Public API.
+
+// If err, forward err; Else if empty, `empty_macro(sse, data)`;
+// Else if `check_macro(next(sse))`, `then_macro(sse, data)`;
+// Else `else_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY_1( \
+ seq_sign_err, empty_macro, check_macro, then_macro, else_macro, data) \
+ BOOST_DETAIL_PP_SIGN_PARSE_APPLY_EMPTY_II(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_PRESENT_1_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY_1_, \
+ (empty_macro, check_macro, then_macro, else_macro, data) )
+
+// If err, forward error.; Else if empty, default error;
+// Else if `check_macro(next(sse))`, `then_macro(sse, data)`;
+// Else `else_macro(sse, data)`.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_1( \
+ seq_sign_err, check_macro, then_macro, else_macro, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY_1(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_DEFAULT_ERR_1_, \
+ check_macro, then_macro, else_macro, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/not.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/not.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_HPP_
+
+#include "return.hpp"
+#include "if.hpp"
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_NO_(seq_sign_err, empty_error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(2, 0, empty_error) /* tokens for empty */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_YES_(seq_sign_err, empty_error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(2, 1, empty_error) /* errror */ )
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_WITH_EMPTY( \
+ seq_sign_err, check_macro, empty_tokens, error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_NO_, \
+ check_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_YES_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_NO_ \
+ , (empty_tokens, error) )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT( \
+ seq_sign_err, check_macro, error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_WITH_EMPTY( \
+ seq_sign_err, check_macro, \
+ BOOST_PP_EMPTY /* use by default for empty */, error)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/opt.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/opt.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT_HPP_
+
+#include "return.hpp"
+#include "if.hpp"
+#include "../parser/seq_next.hpp"
+#include <boost/preprocessor/facilities/empty.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT_NO_(seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_PP_EMPTY)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT_YES_(seq_sign_err, data) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_FWD(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) \
+ BOOST_PP_EMPTY)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, check_macro) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT_NO_, \
+ check_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT_YES_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT_NO_ \
+ , ~)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/postcondition/with_result.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/postcondition/with_result.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,116 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_HPP_
+
+#include "../tagged_opt.hpp"
+#include "../return.hpp"
+#include "../if.hpp"
+#include "../../parser/seq_next.hpp"
+#include "../../../postcondition.hpp"
+#include "../../../parse/finish.hpp"
+#include <boost/detail/preprocessor/keyword/contract/is_postcondition.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+
+// First, parse result name token `(result)`.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_N_ONEMPTY_( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_nonvoid_function_cannot_specify_postcondition_with_no_result)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_N_ISEMPTY_( \
+ result_tok) \
+ BOOST_PP_IS_EMPTY(result_tok)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_RESULTNAME_( \
+ seq_sign_err) \
+ /* use `TAGGED_APPEND` so `EMPTY` appended for opt result name */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_APPEND_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_POSTCONDITION, \
+ BOOST_PP_EMPTY, /* if no (postcondition), `EMPTY` result */ \
+ /* handle (postcondition)() empty result tok (on C99) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_N_ISEMPTY_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_N_ONEMPTY_)
+
+// Then, parse assertion sequence `( (post1) (post2) ... )`.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_ONSIZEN_( \
+ seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_FWD(seq_sign_err, \
+ (BOOST_PP_NIL) /* to handle empty seq */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_ONSIZE0_( \
+ seq_sign_err, unused) \
+ /* got here based on ISSIZE0 check below */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_cannot_specify_postconditions_with_no_assertion)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_ISSIZE0_( \
+ seq) \
+ /* handle (postcondition)(result)() (on C99) */ \
+ BOOST_PP_NOT(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_EMPTY_( \
+ seq_sign_err, unused) \
+ /* handle (postcondition)(result)<NOTHING> */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_cannot_specify_postconditions_with_missing_assertion)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_OK_( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_EMPTY_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_ISSIZE0_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_ONSIZE0_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_ONSIZEN_ \
+ , ~)
+
+// Handle postcondition not specified at all.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_PASS_( \
+ seq_sign_err) \
+ /* If got here, there was no error AND no result was specified. */ \
+ /* This can only happen if `(postcondition)(result)( ... )` was */ \
+ /* omitted all together. In case just return empty assertion */ \
+ /* sequence `(NIL)`. */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ (BOOST_PP_NIL) )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_HASRESULT_( \
+ seq_sign_err, unused) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_POSTCONDITION_HAS_RESULT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH(seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_OK_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_PASS_ \
+ )(seq_sign_err)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_ASSERTIONS_( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_HASRESULT_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_A_HASRESULT_, \
+ ~)
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_ASSERTIONS_( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT_RESULTNAME_( \
+ seq_sign_err \
+ ))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/postcondition/without_result.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/postcondition/without_result.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,41 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_HPP_
+
+#include "../tagged_opt.hpp"
+#include "../return.hpp"
+#include <boost/detail/preprocessor/keyword/contract/is_postcondition.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_ONEMPTY_( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_cannot_specify_postcondition_with_no_assertion)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_ISEMPTY_(seq) \
+ BOOST_PP_NOT(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_POSTCONDITION, \
+ (BOOST_PP_NIL), /* if no (postcondition), no assertions */ \
+ /* handle (postcondition)() empty seq (on C99) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_ISEMPTY_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_ONEMPTY_)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT(seq_sign_err) \
+ /* then parse eventual postcondition assertion sequence */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT_( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_PP_EMPTY)) /* append PP_EMPTY for no result name */
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/req.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/req.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,65 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_HPP_
+
+#include "return.hpp"
+#include "if.hpp"
+#include "../parser/seq_next.hpp"
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_DEFAULT_OP_HANDLE_EMPTY_( \
+ seq_sign_err, append_empty) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_FWD(seq_sign_err, \
+ /* return `toekn [EMPTY]` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) \
+ BOOST_PP_EXPR_IF(append_empty, BOOST_PP_EMPTY) )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_DEFAULT_OP_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_DEFAULT_OP_HANDLE_EMPTY_( \
+ seq_sign_err, 1 /* append EMPTY */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_DEFAULT_OP_NOEMPTY_( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_DEFAULT_OP_HANDLE_EMPTY_( \
+ seq_sign_err, 0 /* do not append EMPTY */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_ERR_(seq_sign_err, op_error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(2, 1, op_error))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_OK_(seq_sign_err, op_error) \
+ BOOST_PP_TUPLE_ELEM(2, 0, op_error)(seq_sign_err) /* op(sse) */
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_OP( \
+ seq_sign_err, check_macro, op_macro, error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_ERR_, /* if empty, err */ \
+ check_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_OK_ /* if check, OK */ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_ERR_ /* if !check, err */ \
+ , (op_macro, error) )
+
+// Used when optional tokens are required (append EMPTY).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ( \
+ seq_sign_err, check_macro, error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_OP(seq_sign_err, check_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_DEFAULT_OP_, error)
+
+// Used for tokens which are ALWAYS required (do not append EMPTY).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_NOEMPTY( \
+ seq_sign_err, check_macro, error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_OP(seq_sign_err, check_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_DEFAULT_OP_NOEMPTY_, error)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/return.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/return.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_HPP_
+
+#include "../parser/err_set.hpp"
+#include "../parser/sign_append.hpp"
+#include "../parser/seq_set.hpp"
+#include "../parser/seq_skip.hpp"
+#include "../parser/seq_next.hpp"
+
+// Return error (no change to seq or sign).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR( \
+ seq_sign_err, error_message) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_SET(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_MSG(error_message))
+
+// Return OK, append result to sign, do not move seq.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, result) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_APPEND(seq_sign_err, result)
+
+// Return OK, append result to sign, set seq to specified reaming-seq.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_OK( \
+ seq_sign_err, result, remaining_seq) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SET( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL( \
+ seq_sign_err, result), remaining_seq)
+
+// Return OK, append result to sign, move seq forward of 1 token.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_FWD(seq_sign_err, result) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL( \
+ seq_sign_err, result))
+
+// Return OK, append next in seq to sign, move seq forward of 1 token.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_NEXT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_FWD(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_not.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_not.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_HPP_
+
+#include "return.hpp"
+#include "apply_1.hpp" // To avoid reentrancy issues.
+#include "if_1.hpp" // To avoid reentrancy issues.
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// Parse no tagged token (not present).
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_ERR_( \
+ seq_sign_err, istag_empty_error) \
+ BOOST_DETAIL_PP_SIGN_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(3, 2, istag_empty_error) /* error */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_OK_( \
+ seq_sign_err, istag_empty_error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(3, 1, istag_empty_error) /* empty_tokens */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_( \
+ seq_sign_err, istag_empty_error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_1(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(3, 0, istag_empty_error), /* istag_macro */ \
+ /* if is tag then error (no-tagged is NOT supposed to match) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_ERR_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_OK_ \
+ , istag_empty_error)
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT( \
+ seq_sign_err, istag_macro, empty_tokens, error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_1(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_, \
+ /* handle empty seq as OK -- if empty, there is not tagged token */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT_OK_, \
+ (istag_macro, empty_tokens, error) )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_opt.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_opt.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,120 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_HPP_
+
+#include "../parser/seq_next.hpp"
+#include "../parser/seq_skip.hpp"
+#include "return.hpp"
+#include "apply_1.hpp" // To avoid reentrance issues.
+#include "apply_2.hpp" // To avoid reentrance issues.
+#include "if_1.hpp" // To avoid reentrance issues.
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+
+// Parse optional tagged token.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_NONEMPTYSEQ_( \
+ seq_sign_err, istag_notag_isempty_onempty_append01) \
+ /* in (tag)( seq ) -- found tag and non-empty seq, return seq */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_FWD(seq_sign_err, \
+ BOOST_PP_IIF(BOOST_PP_TUPLE_ELEM(5, 4, \
+ istag_notag_isempty_onempty_append01), \
+ /* append no_tag_seq to handle optional */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) \
+ BOOST_PP_TUPLE_ELEM(5, 1, \
+ istag_notag_isempty_onempty_append01) \
+ , \
+ /* prepend no_tag_seq to handle empty seq */ \
+ BOOST_PP_TUPLE_ELEM(5, 1, \
+ istag_notag_isempty_onempty_append01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) \
+ ))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_EMPTYSEQ_( \
+ seq_sign_err, istag_notag_isempty_onempty_append01) \
+ /* in (tag)( seq ) -- found tag but seq is empty, on_empty(sse) */ \
+ BOOST_PP_TUPLE_ELEM(5, 3, istag_notag_isempty_onempty_append01)( \
+ seq_sign_err)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_SOMESEQ_( \
+ seq_sign_err, istag_notag_isempty_onempty_append01) \
+ /* on C99, found seq could still be empty `()` */ \
+ BOOST_PP_IIF( /* is_empty(next(sse)) */ \
+ BOOST_PP_TUPLE_ELEM(5, 2, istag_notag_isempty_onempty_append01) \
+ ( BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_EMPTYSEQ_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_NONEMPTYSEQ_ \
+ )(seq_sign_err, istag_notag_isempty_onempty_append01)
+
+// Tag found.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_YESTAG_( \
+ seq_sign_err, istag_notag_isempty_onempty_append01) \
+ /* in (tag)( seq ) -- tag found, now inspect seq */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_2( \
+ /* need to APPLY again because of SKIP */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_SOMESEQ_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_EMPTYSEQ_, \
+ istag_notag_isempty_onempty_append01)
+
+// Tag not found.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_NOTAG_( \
+ seq_sign_err, istag_notag_isempty_onempty_append01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ /* no_tag_seq */ \
+ BOOST_PP_TUPLE_ELEM(5, 1, istag_notag_isempty_onempty_append01))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_TAG_( \
+ seq_sign_err, istag_notag_isempty_onempty_append01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_1(seq_sign_err, \
+ /* is_tag_macro */ \
+ BOOST_PP_TUPLE_ELEM(5, 0, istag_notag_isempty_onempty_append01), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_YESTAG_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_NOTAG_ \
+ , istag_notag_isempty_onempty_append01)
+
+// Empty tag.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_EMPTYTAG_( \
+ seq_sign_err, istag_notag_isempty_onempty_append01) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ /* no_tag_seq */ \
+ BOOST_PP_TUPLE_ELEM(5, 1, istag_notag_isempty_onempty_append01))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_(seq_sign_err, \
+ is_tag_macro, no_tag_seq, \
+ is_empty_seq_macro, on_empty_seq_macro, append_empty_01) \
+ /* in (tag)( seq ) -- first look for tag */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_1(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_TAG_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_EMPTYTAG_, \
+ ( is_tag_macro, no_tag_seq, \
+ is_empty_seq_macro, on_empty_seq_macro, append_empty_01 ) )
+
+// Public API.
+
+// By default on_empty_seq_macro is prepended to generate NILSEQ (NIL)...
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT(seq_sign_err, \
+ is_tag_macro, no_tag_seq, \
+ is_empty_seq_macro, on_empty_seq_macro) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_(seq_sign_err, \
+ is_tag_macro, no_tag_seq, \
+ is_empty_seq_macro, on_empty_seq_macro, 0 /* prepend (default) */)
+
+// This macro appends on_empty_seq_macro (above macro prepends it instead).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_APPEND_OPT(seq_sign_err, \
+ is_tag_macro, no_tag_seq, \
+ is_empty_seq_macro, on_empty_seq_macro) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT_(seq_sign_err, \
+ is_tag_macro, no_tag_seq, \
+ is_empty_seq_macro, on_empty_seq_macro, 1 /* append */)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_req.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/tagged_req.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,76 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_HPP_
+
+#include "../parser/seq_next.hpp"
+#include "../parser/seq_skip.hpp"
+#include "return.hpp"
+#include "apply_1.hpp" // To avoid reentrancy issues.
+#include "apply_2.hpp" // To avoid reentrancy issues.
+#include "if_1.hpp" // To avoid reentrancy issues.
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+
+// Parse required tagged tokens an in `(tag)( tokens )`.
+
+// Called if empty seq, tag not found, empty tagged seq, etc.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_ERR_( \
+ seq_sign_err, istag_isempty_error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(3, 2, istag_isempty_error) /* error */ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_NONEMPTYSEQ_( \
+ seq_sign_err, istag_isempty_error) \
+ /* in (tag)( seq ) -- found tag and non-empty seq, return seq */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_RETURN_FWD(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_SOMESEQ_( \
+ seq_sign_err, istag_isempty_error) \
+ /* on C99, found seq could still be empty `()` */ \
+ BOOST_PP_IIF( /* is_empty(next(sse)) */ \
+ BOOST_PP_TUPLE_ELEM(3, 1, istag_isempty_error) \
+ ( BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) ), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_ERR_ /* empty tokens */\
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_NONEMPTYSEQ_ \
+ )(seq_sign_err, istag_isempty_error)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_YESTAG_( \
+ seq_sign_err, istag_isempty_error) \
+ /* in (tag)( seq ) -- tag found, now inspect seq */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_2( \
+ /* need to APPLY again because of SKIP */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_SOMESEQ_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_ERR_, /*empty after*/\
+ istag_isempty_error)
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_( \
+ seq_sign_err, istag_isempty_error) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_1(seq_sign_err, \
+ BOOST_PP_TUPLE_ELEM(3, 0, istag_isempty_error), /* is_tag_macro */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_YESTAG_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_ERR_ /* no tag found */ \
+ , istag_isempty_error)
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ(seq_sign_err, \
+ is_tag_macro, is_empty_macro, error) \
+ /* in (tag)( seq ) -- first look for tag */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY_1(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ_ERR_, /* empty seq */ \
+ ( is_tag_macro, is_empty_macro, error ) )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parse/until.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parse/until.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,73 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_HPP_
+
+#include "apply.hpp"
+#include "../parser/sign_set.hpp"
+#include "../parser/sign_replace_back.hpp"
+#include "../parser/sign_back.hpp"
+#include "../parser/seq_next.hpp"
+#include "../parser/seq_skip.hpp"
+#include "../parser/sign_append.hpp"
+#include "../../parser/sign.hpp"
+#include <boost/preprocessor/control/while.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// Concatenate last elem of seq onto last elem of sign.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_CONCAT_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_SET(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_REPLACE_BACK(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_BACK(seq_sign_err) \
+ /* seq append next elem `(next)` */ \
+ ( BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT( \
+ seq_sign_err) ) \
+ )))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_DEFAULT_OP_(n, seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( /* move to next in seq */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_CONCAT_(seq_sign_err))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_D_(seq_sign_err, d_op_pred) \
+ /* use PP_CAT() (not ##) to expand tuple elem */ \
+ BOOST_PP_CAT(BOOST_PP_WHILE_, BOOST_PP_TUPLE_ELEM(3, 0, d_op_pred))( \
+ BOOST_PP_TUPLE_ELEM(3, 1, d_op_pred), /* pred_macro */ \
+ BOOST_PP_TUPLE_ELEM(3, 2, d_op_pred), /* op_macro */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_APPEND(seq_sign_err, \
+ (BOOST_PP_NIL) /* handle empty seq */ ))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_EMPTY_D_( \
+ seq_sign_err, d_op_pred) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ (BOOST_PP_NIL) /* handle empty seq */ )
+
+// Public API.
+
+// Reentrant version.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_WITH_OP_D( \
+ d, seq_sign_err, pred_macro, op_macro) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_D_, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_EMPTY_D_, \
+ (d, pred_macro, op_macro) )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_WITH_OP( \
+ seq_sign_err, pred_macro, op_macro) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_WITH_OP_D( \
+ 1, seq_sign_err, pred_macro, op_macro)
+
+// Until pred_macro(n, sse), extract sequence from seq.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL(seq_sign_err, pred_macro) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_WITH_OP_D( \
+ 1, seq_sign_err, pred_macro, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_DEFAULT_OP_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/count.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/count.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSED_COUNT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_COUNT_HPP_
+
+#include <boost/preprocessor/array/size.hpp>
+
+// Return the size of parsed sign plus 1 (because of the extra `NIL` token
+// internally used to handle empty sequences, the "plus 1" is the reason why
+// this is called "count" instead of "size").
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_COUNT(seq_sign_err) \
+ BOOST_PP_ARRAY_SIZE(BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/elem.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/elem.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,19 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM_HPP_
+
+#include <boost/preprocessor/array/elem.hpp>
+
+// Index as #defined in "indexes.hpp".
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM(index, sign) \
+ /* parsed signature internally stored as array with indexed by ID */ \
+ BOOST_PP_ARRAY_ELEM(index, sign)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/indexes.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parsed/indexes.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSED_INDEXES_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_INDEXES_HPP_
+
+// NOTE: NIL always terminates sign to avoid arrays with last element
+// terminated by `PP_EMPTY` (which cause expansion problems on MSVC...).
+
+// IMPORTANT: The ..._INDEX_MAX cannot be larger than BOOST_PP_ARRAY max size
+// which is 25. If it ever needs to eceed this limit, some elements could be
+// combined in sub-arrays or tuple (e.g., the params namespace, induced, and
+// deduced could be represented as a 3-tuple using 1 signle array element
+// instead of 3).
+
+// Operations (functions, constructors, etc).
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_BODY_INDEX 0
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_ACCESS_INDEX 1
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_EXPORT_INDEX 2
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_TEMPLATE_PARAMS_INDEX 3
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_REQUIRES_INDEX 4
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_EXPLICIT_INDEX 5
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_INLINE_INDEX 6
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_EXTERN_INDEX 7
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_STATIC_INDEX 8
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_VIRTUAL_INDEX 9
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_RESULT_TYPE_INDEX 10
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_NAME_INDEX 11
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_PARAMS_TAG_INDEX 12
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_PARAMS_INDUCED_INDEX 13
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_PARAMS_DEDUCED_INDEX 14
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CONST_INDEX 15
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_VOLATILE_INDEX 16
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_COPYABLE_INDEX 17
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_THROW_INDEX 18
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_INITIALIZERS_INDEX 19
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_PRECONDITION_INDEX 20
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_POSTCONDITION_RESULT_INDEX 21
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_POSTCONDITION_INDEX 22
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_NIL_INDEX 23
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_INDEX_MAX 24
+
+// Class.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_TYPE_INDEX 0
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_BASES_INDEX 1
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_STATIC_INVARIANT_INDEX 2
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_INVARIANT_INDEX 3
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_NIL_INDEX 4
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_INDEX_MAX 5
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_msg.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_msg.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,15 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSER_ERR_MSG_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_MSG_HPP_
+
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_MSG(message) \
+ (1 /* error */, message /* error message */)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_none.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_none.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,15 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_NONE_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_NONE_HPP_
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_NONE \
+ (0 /* no error */, BOOST_PP_NIL /* no error message */)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_set.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/err_set.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_SET_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_SET_HPP_
+
+#include "../../parser/seq.hpp"
+#include "../../parser/sign.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_SET(seq_sign_err, err) \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err) \
+ , \
+ err \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/indexes.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/indexes.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_INDEXES_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_INDEXES_HPP_
+
+// Parser's data is a 3-tuple `(seq, sign, err)` where:
+// 0) seq -- sequence left still to be parsed (or `(NIL)`).
+// 1) sign -- signature parsed so far (or `(NIL)`).
+// 2) err -- if there is an error or not (with related error message).
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_INDEX 0
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_INDEX 1
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_INDEX 2
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_INDEX_MAX 3
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/is_member.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/is_member.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,56 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_HPP_
+
+#include "seq_next.hpp"
+#include "../parse/apply.hpp"
+#include "../../parser/err.hpp"
+#include <boost/detail/preprocessor/keyword/is_public.hpp>
+#include <boost/detail/preprocessor/keyword/is_protected.hpp>
+#include <boost/detail/preprocessor/keyword/is_private.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+
+// Check token and not on seq_sign_err.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_ACCESS_TOKEN(token) \
+ BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_PUBLIC(token) \
+ , BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_PROTECTED(token) \
+ , BOOST_DETAIL_PP_KEYWORD_IS_PRIVATE(token) \
+ ) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_CHECK_( \
+ seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_ACCESS_TOKEN( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err))
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_NOT_( \
+ seq_sign_err, unused) \
+ 0 /* return not a member */
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_(seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_CHECK_, \
+ /* if empty seq, it is NOT a member */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_NOT_, ~)
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER(seq_sign_err) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ /* if error, it is NOT a member */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_NOT_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER_ \
+ )(seq_sign_err, ~)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/merge.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/merge.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,78 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE_HPP_
+
+#include "../../parser/seq.hpp"
+#include "../../parser/sign.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+
+/** @todo Check if all of these merges are still used and remove eventually unused ones. */
+
+// Merge two SSE as: seq as specified, sign of 1 followed by sign of 2, err from
+// either 1 or 2 with non empty err.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE( \
+ seq_sign_err1, seq_sign_err2, seq) \
+ ( /* remaining seq */ \
+ seq \
+ , /* sign 1 followed by 2 */ \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err1) /* seq append */ \
+ /* `TAIL()` removes leading `(NIL)` (to handle empty seq) */ \
+ BOOST_PP_SEQ_TAIL(BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err2)) \
+ , /* err from either one that is not OK (or NONE if both OK) */ \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR( \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR( \
+ seq_sign_err1), \
+ seq_sign_err1 /* take err1 (because not OK) */ \
+ , \
+ seq_sign_err2 /* take err2 (might or not be OK) */ \
+ ) \
+ ) \
+ )
+
+// Merges only the 2nd element from sign2.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE_2ND_( \
+ seq_sign_err1, seq_sign_err2, seq) \
+ ( /* remaining seq */ \
+ seq \
+ , /* sign 1 followed by 2nd elem of sign 2 */ \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err1) /* seq append */ \
+ BOOST_PP_SEQ_ELEM(2, \
+ /* take 2nd elem from sign2 (0 is NIL, 1 is 1st, 2 is 2nd) */ \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err2)) \
+ , /* err from either one that is not OK (or NONE if both OK) */ \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR( \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR( \
+ seq_sign_err1), \
+ seq_sign_err1 /* take err1 (because not OK) */ \
+ , \
+ seq_sign_err2 /* take err2 (might or not be OK) */ \
+ ) \
+ ) \
+ )
+
+// Merge two SSE as: seq from 2, sign of 1 followed by sign of 2, err from
+// either 1 or 2 with non empty err.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE2( \
+ seq_sign_err1, seq_sign_err2) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE( \
+ seq_sign_err1, seq_sign_err2, \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err2))
+
+// As merge 2 must skips 1st elem in sign2.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE2_2ND( \
+ seq_sign_err1, seq_sign_err2) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE_2ND_( \
+ seq_sign_err1, seq_sign_err2, \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err2))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_next.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_next.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,19 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT_HPP_
+
+#include "../../parser/seq.hpp"
+#include <boost/preprocessor/seq/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err) \
+ BOOST_PP_SEQ_ELEM(0 /* next elem in seq left to be parsed */, \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_set.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_set.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SET_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SET_HPP_
+
+#include "../../parser/sign.hpp"
+#include "../../parser/err.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SET(seq_sign_err, seq) \
+ ( \
+ seq \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_skip.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/seq_skip.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,28 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP_HPP_
+
+#include "../../parser/seq.hpp"
+#include "../../parser/sign.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/seq/seq.hpp> // For PP_SEQ_TAIL.
+
+// Assume 2 or more elem in seq.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP(seq_sign_err) \
+ ( \
+ /* skip head in seq left to be parsed */ \
+ BOOST_PP_SEQ_TAIL(BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_append.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_append.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,29 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_APPEND_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_APPEND_HPP_
+
+#include "../../parser/seq.hpp"
+#include "../../parser/sign.hpp"
+#include "../../parser/err.hpp"
+#include <boost/preprocessor/array/push_back.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_APPEND( \
+ seq_sign_err, sign_elem_to_append) \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err) \
+ /* append using seq concatenation */ \
+ (sign_elem_to_append) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_back.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_back.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_BACK_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_BACK_HPP_
+
+#include "../../parser/sign.hpp"
+#include <boost/detail/preprocessor/seq.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/array/size.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_BACK(seq_sign_err) \
+ BOOST_DETAIL_PP_SEQ_BACK(BOOST_DETAIL_PP_SIGN_PARSER_SIGN( \
+ seq_sign_err))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_nil.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_nil.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,17 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL_HPP_
+
+// Use this instead of `(NIL)` directly to hide implementation detail that
+// signature are represented by sequences while being parsed.
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL \
+ (BOOST_PP_NIL) /* handle empty seq */
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_replace_back.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_replace_back.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,32 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_REPLACE_BACK_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_REPLACE_BACK_HPP_
+
+#include "../../parser/seq.hpp"
+#include "../../parser/sign.hpp"
+#include "../../parser/err.hpp"
+#include <boost/detail/preprocessor/seq.hpp>
+#include <boost/preprocessor/array/replace.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/array/size.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_REPLACE_BACK( \
+ seq_sign_err, sign_new_back_elem) \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SEQ_LEAD( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN(seq_sign_err)) \
+ (sign_new_back_elem) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_set.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/aux_/parser/sign_set.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_SET_HPP_
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_SET_HPP_
+
+#include "../../parser/seq.hpp"
+#include "../../parser/err.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_SET(seq_sign_err, sign) \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ , \
+ sign \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/body.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/body.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_BODY_HPP_
+#define BOOST_DETAIL_PP_SIGN_BODY_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+
+/** @todo To improve performances, consider removing trailing EMPTY for req signature traits -- but would removing EMPTY really improve performances? For example, body should always be there (either as {}, or ;, or = 0;, etc) so EMPTY is not needed here. Check all traits that only have a _REQ macro so they cannot be optional _OPT or none _NO and they can omit trailing EMPTY for efficiency. */
+
+#define BOOST_DETAIL_PP_SIGN_BODY(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_BODY_INDEX, sign)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/class_base.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/class_base.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_CLASS_BASE_HPP_
+#define BOOST_DETAIL_PP_SIGN_CLASS_BASE_HPP_
+
+#include "aux_/class_base_indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// Return base type.
+#define BOOST_DETAIL_PP_SIGN_CLASS_BASE_TYPE(base) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASE_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASE_TYPE_INDEX, base)
+
+// Return base inheritance access level -- public, protected, or private.
+#define BOOST_DETAIL_PP_SIGN_CLASS_BASE_ACCESS(base) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASE_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASE_ACCESS_INDEX, base)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/class_bases.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/class_bases.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_CLASS_BASES_HPP_
+#define BOOST_DETAIL_PP_SIGN_CLASS_BASES_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+// Assume `HAS_BASES()` and return bases as a sequence `(base1)(base2)...`.
+// Use `CLASS_BASE_XXX(base)` to inspect each base element.
+#define BOOST_DETAIL_PP_SIGN_CLASS_BASES(sign) \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ(BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_CLASS_BASES_INDEX, sign))
+
+// Need to use this instead of `PP_SEQ_SIZE(SIGN_CLASS_BASES(sign))` because
+// this can be 0 while `PP_SEQ_SIZE()` cannot be 0 (it can be 0 only on C99).
+#define BOOST_DETAIL_PP_SIGN_CLASS_BASES_SIZE(sign) \
+ BOOST_DETAIL_PP_NILSEQ_SIZE(BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_BASES_INDEX, sign))
+
+#define BOOST_DETAIL_PP_SIGN_CLASS_HAS_BASES(sign) \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_BASES_INDEX, sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/class_invariants.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/class_invariants.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,38 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef CONTRACT_AUX_PP_SIGN_CLASS_INVARIANTS_HPP_
+#define CONTRACT_AUX_PP_SIGN_CLASS_INVARIANTS_HPP_
+
+#include "sign_/elem.hpp"
+#include "../nilseq.hpp"
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+// Non-static invariant.
+
+#define CONTRACT_AUX_PP_SIGN_CLASS_INVARIANT(sign) \
+ CONTRACT_AUX_PP_NILSEQ_TO_SEQ(CONTRACT_AUX_PP_SIGN_ELEM( \
+ CONTRACT_AUX_PP_SIGN_CLASS_INVARIANT_ID, sign))
+
+#define CONTRACT_AUX_PP_SIGN_CLASS_HAS_INVARIANT(sign) \
+ BOOST_PP_NOT(CONTRACT_AUX_PP_NILSEQ_IS_NIL(CONTRACT_AUX_PP_SIGN_ELEM( \
+ CONTRACT_AUX_PP_SIGN_CLASS_INVARIANT_ID, sign)))
+
+// Static invariant.
+
+#define CONTRACT_AUX_PP_SIGN_CLASS_STATIC_INVARIANT(sign) \
+ CONTRACT_AUX_PP_NILSEQ_TO_SEQ(CONTRACT_AUX_PP_SIGN_ELEM( \
+ CONTRACT_AUX_PP_SIGN_CLASS_STATIC_INVARIANT_ID, sign))
+
+#define CONTRACT_AUX_PP_SIGN_CLASS_HAS_STATIC_INVARIANT(sign) \
+ BOOST_PP_NOT(CONTRACT_AUX_PP_NILSEQ_IS_NIL(CONTRACT_AUX_PP_SIGN_ELEM( \
+ CONTRACT_AUX_PP_SIGN_CLASS_STATIC_INVARIANT_ID, sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/class_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/class_type.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,18 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef CONTRACT_AUX_PP_SIGN_CLASS_TYPE_HPP_
+#define CONTRACT_AUX_PP_SIGN_CLASS_TYPE_HPP_
+
+#include "sign_/ids.hpp"
+#include "sign_/elem.hpp"
+
+#define CONTRACT_AUX_PP_SIGN_CLASS_TYPE(sign) \
+ CONTRACT_AUX_PP_SIGN_ELEM(CONTRACT_AUX_PP_SIGN_CLASS_TYPE_ID, sign)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/const.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/const.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_CONST_HPP_
+#define BOOST_DETAIL_PP_SIGN_CONST_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_CONST(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_CONST_INDEX, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_CONST(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_CONST(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/copyable.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/copyable.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_COPYABLE_HPP_
+#define BOOST_DETAIL_PP_SIGN_COPYABLE_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/index.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_COPYABLE(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_COPYABLE_ID, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_COPYABLE(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_COPYABLE(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/explicit.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/explicit.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_EXPLICIT_HPP_
+#define BOOST_DETAIL_PP_SIGN_EXPLICIT_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_EXPLICIT(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_EXPLICIT_ID, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_EXPLICIT(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_EXPLICIT(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/export.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/export.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_EXPORT_HPP_
+#define BOOST_DETAIL_PP_SIGN_EXPORT_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_EXPORT(sign) \
+ BOOST_DETAIL_PP_SIGN_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_PARSED_EXPORT_INDEX, sign) \
+ (/* expand empty */)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/extern.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/extern.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_EXTERN_HPP_
+#define BOOST_DETAIL_PP_SIGN_EXTERN_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_EXTERN(sign) \
+ BOOST_DETAIL_PP_SIGN_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_PARSED_EXTERN_ID, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_EXTERN(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_EXTERN(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/initializers.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/initializers.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_INITIALIZERS_HPP_
+#define BOOST_DETAIL_PP_SIGN_INITIALIZERS_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_INITIALIZERS(sign) \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ(BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ CONTRACT_DETAOL_PP_SIGN_AUX_PARSED_INITIALIZERS_INDEX, sign))
+
+#define BOOST_DETAIL_PP_SIGN_HAS_INITIALIZERS(sign) \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL( \
+ BOOST_DETAIL_PP_SIGN_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_INITIALIZERS_INDEX, \
+ sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/inline.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/inline.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_INLINE_HPP_
+#define BOOST_DETAIL_PP_SIGN_INLINE_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_INLINE(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_INLINE_INDEX, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_INLINE(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_INLINE(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/member.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/member.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,18 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_MEMBER_HPP_
+#define BOOST_DETAIL_PP_SIGN_MEMBER_HPP_
+
+#include "access.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_IS_MEMBER(sign) \
+ /* IMPLEMENTATION: It is a member function iff it has non-empty access. */ \
+ BOOST_DETAIL_PP_SIGN_HAS_ACCESS(sign)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/name.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,61 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_NAME_HPP_
+#define BOOST_DETAIL_PP_SIGN_NAME_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/keyword/is_operator.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// Handle special name `( operator (symbol, word) )` for operators.
+// These are NOT local macros -- do NOT #undef them! Mixed case
+// names are necesseray because they must be prefixed by "operator".
+
+#define BOOST_DETAIL_PP_SIGN_NAME_AS_WORD_operator(symbol, word) \
+ /* use ## instead of PP_CAT here for proper macro expansion */ \
+ operator_ ## word /* e.g., operator_equal */
+
+#define BOOST_DETAIL_PP_SIGN_NAME_AS_SYMBOL_operator(symbol, word) \
+ operator symbol /* e.g., operator== */
+
+#define BOOST_DETAIL_PP_SIGN_NAME_WORD(name) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_KEYWORD_IS_OPERATOR(name), \
+ /* expand to `PP_SIGN_NAME_AS_WORD_operator()` */ \
+ BOOST_PP_CAT(BOOST_DETAIL_PP_SIGN_NAME_AS_WORD_, name) \
+ , /* else */ \
+ name \
+ ) /* endif */
+
+// Get name or symbol.
+
+#define BOOST_DETAIL_PP_SIGN_NAME_(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_NAME_INDEX, sign)
+
+#define BOOST_DETAIL_PP_SIGN_NAME(sign) \
+ BOOST_DETAIL_PP_SIGN_NAME_WORD(BOOST_DETAIL_PP_SIGN_NAME_(sign))
+
+#define BOOST_DETAIL_PP_SIGN_NAME_IS_OPERATOR(sign) \
+ BOOST_DETAIL_PP_KEYWORD_IS_OPERATOR(BOOST_DETAIL_PP_SIGN_NAME_(sign))
+
+#define BOOST_DETAIL_PP_SIGN_NAME_SYMBOLIC_TOKEN(name_token) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_KEYWORD_IS_OPERATOR(name_token), \
+ /* expand to `PP_SIGN_NAME_AS_SYMBOL_operator()` */ \
+ BOOST_PP_CAT(BOOST_DETAIL_PP_SIGN_NAME_AS_SYMBOL_, name_token) \
+ , /* else */ \
+ name_token \
+ ) /* endif */
+
+#define BOOST_DETAIL_PP_SIGN_NAME_SYMBOLIC(sign) \
+ BOOST_DETAIL_PP_SIGN_NAME_SYMBOLIC_TOKEN( \
+ BOOST_DETAIL_PP_SIGN_NAME_(sign))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/param.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/param.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAM_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAM_HPP_
+
+#include "aux_/params_indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_(index, n, params) \
+ BOOST_DETAIL_PP_NILSEQ_ELEM(n, BOOST_PP_ARRAY_ELEM(index, params))
+
+#define BOOST_DETAIL_PP_SIGN_PARAM(n, params) \
+ BOOST_DETAIL_PP_SIGN_PARAM_( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDUCED_INDEX, n, params)
+
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAM(n, params) \
+ BOOST_DETAIL_PP_SIGN_PARAM_( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_DEDUCED_INDEX, n, params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/param/classifier.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/param/classifier.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAM_CLASSIFIER_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAM_CLASSIFIER_HPP_
+
+#include "../aux_/param_indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_CLASSIFIER(param) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAM_CLASSIFIER_INDEX, param) \
+ (/* expand empty */)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/param/default.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/param/default.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,26 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAM_DEFAULT_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAM_DEFAULT_HPP_
+
+#include "../aux_/param_indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_DEFAULT(param) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAM_DEFAULT_INDEX, param) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_HAS_DEFAULT(param) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY( \
+ BOOST_DETAIL_PP_SIGN_PARAM_DEFAULT(param)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/param/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/param/name.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAM_NAME_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAM_NAME_HPP_
+
+#include "../aux_/param_indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_NAME(param) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAM_NAME_INDEX, param) \
+ /* no trailing empty because param-name always there */
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/param/qualifier.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/param/qualifier.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,28 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAM_QUALIFIER_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAM_QUALIFIER_HPP_
+
+#include "../aux_/param_indexes.hpp"
+#include <boost/detail/preprocessor/nonempty_is_xxx.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_QUALIFIER(param) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAM_QUALIFIER_INDEX, param) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_IS_COPYABLE(param) \
+ BOOST_DETAIL_PP_NONEMPTY_IS_XXX(param, \
+ BOOST_DETAIL_PP_SIGN_PARAM_QUALIFIER, \
+ BOOST_DETAIL_PP_KEYWORD_IS_COPYABLE)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/param/type.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/param/type.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAM_TYPE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAM_TYPE_HPP_
+
+#include "../aux_/param_indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAM_TYPE(param) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARAM_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAM_TYPE_INDEX, param) \
+ /* no trailing empty because param-type always there */
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,36 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include "aux_/params_indexes.hpp"
+
+// Function parameters (positional or named).
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS(sign) \
+ /* params represented as 3-array `(3, (tag, induced, deduced))` */ \
+ (BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDEX_MAX, \
+ ( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_PARAMS_TAG_INDEX, \
+ sign) \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_PARAMS_INDUCED_INDEX, \
+ sign) \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_PARAMS_DEDUCED_INDEX, \
+ sign) \
+ ) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/enum.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/enum.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,65 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_HPP_
+
+#include "size.hpp"
+#include "../param.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_O_(z, n, op_data_params) \
+ BOOST_PP_TUPLE_ELEM(3, 0, op_data_params)(z, \
+ BOOST_DETAIL_PP_SIGN_PARAM(n, \
+ BOOST_PP_TUPLE_ELEM(3, 2, op_data_params)), \
+ BOOST_PP_TUPLE_ELEM(3, 1, op_data_params) )
+
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_ENUM_O_(z, n, op_data_params) \
+ BOOST_PP_TUPLE_ELEM(3, 0, op_data_params)(z, \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAM(n, \
+ BOOST_PP_TUPLE_ELEM(3, 2, op_data_params)), \
+ BOOST_PP_TUPLE_ELEM(3, 1, op_data_params) )
+
+// Induced params.
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_Z(z, op_macro, data, params) \
+ BOOST_PP_ENUM_ ## z(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_O_, \
+ (op_macro, data, params) ) \
+
+// Expand to `op_macro(z, param0, data), op_macro(z, param1, data), ...`.
+#define BOOST_DETAIL_PP_SIGN_PARAMS_ENUM(op_macro, data, params) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_Z(1, op_macro, data, params)
+
+// Deduced params.
+
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_ENUM_Z( \
+ z, op_macro, data, params) \
+ BOOST_PP_ENUM_ ## z(BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_ENUM_O_, \
+ (op_macro, data, params) )
+
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_ENUM(op_macro, data, params) \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_ENUM_Z(1, op_macro, data, params)
+
+// All (induced and decuded) params.
+
+#define BOOST_DETAIL_PP_SIGN_ALL_PARAMS_ENUM_Z(z, op_macro, data, params) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_Z(z, op_macro, data, params) \
+ BOOST_PP_COMMA_IF(BOOST_PP_AND( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_SIZE(params))) \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_ENUM_Z(z, op_macro, data, params)
+
+#define BOOST_DETAIL_PP_SIGN_ALL_PARAMS_ENUM(op_macro, data, params) \
+ BOOST_DETAIL_PP_SIGN_ALL_PARAMS_ENUM_Z(1, op_macro, data, params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/first_n.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/first_n.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,32 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_FIRST_N_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FIRST_N_HPP_
+
+#include "../aux_/params_indexes.hpp"
+#include <boost/preprocessor/seq/first_n.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FIRST_N(n, params) \
+ /* don't use `PP_ARRAY_REPLACE` for reentrancy (and MSVC problems) */ \
+ (BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDEX_MAX, ( \
+ BOOST_PP_ARRAY_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARAMS_TAG_INDEX, \
+ params) \
+ , \
+ BOOST_PP_SEQ_FIRST_N(BOOST_PP_INC(n), /* inc keeps leading NIL */ \
+ BOOST_PP_ARRAY_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDUCED_INDEX, \
+ params)) \
+ , \
+ BOOST_PP_ARRAY_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARAMS_DEDUCED_INDEX, \
+ params) \
+ ))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/fold_left.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/fold_left.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,63 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_HPP_
+
+#include "size.hpp"
+#include "../param.hpp"
+#include "../aux_/params_indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/seq/fold_left.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/control/if.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_S_( \
+ s, op_macro, state, params, params_size, params_index) \
+ BOOST_PP_SEQ_FOLD_LEFT_ ## s(op_macro, state, \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ(BOOST_PP_ARRAY_ELEM( \
+ params_index, params)))
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_IDENTITY_S_( \
+ s, op_macro, state, params, params_size, params_index) \
+ state /* just forward original state */
+
+// Induced params.
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_S(s, op_macro, state, params) \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_S_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_IDENTITY_S_ \
+ )(s, op_macro, state, params, \
+ BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDUCED_INDEX)
+
+// Expand to `op_macro(s, op_macro(s, state, param0), param1)...`.
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT(op_macro, state, params) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_S(1, op_macro, state, params)
+
+// Deduced params.
+
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_FOLD_LEFT_S( \
+ s, op_macro, state, params) \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_S_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT_IDENTITY_S_ \
+ )(s, op_macro, state, params, \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_DEDUCED_INDEX)
+
+// Expand to `op_macro(s, op_macro(s, state, param0), param1)...`.
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_FOLD_LEFT( \
+ op_macro, state, params) \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_FOLD_LEFT_S( \
+ 1, op_macro, state, params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/for_each.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/for_each.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,28 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_FOR_EACH_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOR_EACH_HPP_
+
+#include "size.hpp"
+#include "../param.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOR_EACH_O_(z, n, op_params) \
+ BOOST_PP_TUPLE_ELEM(2, 0, op_params) \
+ (z, n, BOOST_DETAIL_PP_SIGN_PARAM(n, \
+ BOOST_PP_TUPLE_ELEM(2, 1, op_params)))
+
+// Expand in `op_macro(z, 0, param0) op_macro(z, 1, param1) ...`.
+#define BOOST_DETAIL_PP_SIGN_PARAMS_FOR_EACH(op_macro, params) \
+ BOOST_PP_REPEAT(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FOR_EACH_O_, \
+ (op_macro, params))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/named.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/named.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,18 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_NAMED_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_NAMED_HPP_
+
+#include "tag_namespace.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_ARE_NAMED(params) \
+ /* params are named iff the have non-empty tag namespace */ \
+ BOOST_DETAIL_PP_SIGN_PARAMS_HAVE_TAG_NAMESPACE(params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/size.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/size.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,32 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_SIZE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_SIZE_HPP_
+
+#include "../aux_/params_indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+
+// Induced params.
+#define BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params) \
+ BOOST_DETAIL_PP_NILSEQ_SIZE(BOOST_PP_ARRAY_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_INDUCED_INDEX, params))
+
+// Deduced params.
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_SIZE(params) \
+ BOOST_DETAIL_PP_NILSEQ_SIZE(BOOST_PP_ARRAY_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_DEDUCED_INDEX, params))
+
+// All params.
+#define BOOST_DETAIL_PP_SIGN_ALL_PARAMS_SIZE(params) \
+ BOOST_PP_ADD(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_SIZE(params))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/tag_namespace.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/tag_namespace.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,51 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_TAG_NAMESPACE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_TAG_NAMESPACE_HPP_
+
+#include "size.hpp"
+#include "../aux_/params_indexes.hpp"
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// Namespace tokens can be one of the following:
+// 1) `PP_EMPTY` for no namespace.
+// 2) `PP_EMPTY PP_EMPTY` for default namespace.
+// 3) `token PP_EMPTY PP_EMPTY` for namespace `token` (non default).
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_TAG_NAMESPACE_(params) \
+ BOOST_PP_ARRAY_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARAMS_TAG_NAMESPACE_INDEX, params)
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_HAVE_TAG_NAMESPACE_(params) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_TAG_NAMESPACE_(params) \
+ (/* exapnd empty */) ))
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_HAVE_TAG_NAMESPACE(params) \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_ALL_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_PARAMS_HAVE_TAG_NAMESPACE_ \
+ , \
+ 0 /* no params so no named params */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(params)
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_TAG_NAMESPACE(params) \
+ BOOST_PP_EXPAND( /* for double `PP_EMPTY` expansion */ \
+ BOOST_DETAIL_PP_SIGN_PARAMS_TAG_NAMESPACE_(params) \
+ (/* exapnd empty */)(/* exapnd empty */) )
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_HAVE_DEFAULT_TAG_NAMESPACE(params) \
+ BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_PARAMS_TAG_NAMESPACE(params))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/params/to_seq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/params/to_seq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,46 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARAMS_TO_SEQ_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARAMS_TO_SEQ_HPP_
+
+#include "size.hpp"
+#include "fold_left.hpp"
+#include <boost/preprocessor/seq/seq.hpp> // For TAIL.
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARAMS_TO_SEQ_( \
+ op_macro, params, params_fold_left_macro) \
+ BOOST_PP_SEQ_TAIL( /* remove `PP_NIL`, if got here size >= 1 */ \
+ params_fold_left_macro(op_macro, \
+ (BOOST_PP_NIL), /* handle empty */ \
+ params))
+
+// Public APIs.
+
+// Expand to `seq` from `op_macro(s, op_macro(s, seq, param0), param1)...`.
+// (Automatically handles empty seq and empty params -- expansion done only
+// when params not empty, seq start as (PP_EMPTY) which is then removed.)
+#define BOOST_DETAIL_PP_SIGN_PARAMS_TO_SEQ(op_macro, params) \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_PARAMS_TO_SEQ_ \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(op_macro, params, BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT) \
+
+// Same for deduced params.
+#define BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_TO_SEQ(op_macro, params) \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_SIZE(params), \
+ BOOST_DETAIL_PP_SIGN_PARAMS_TO_SEQ_ \
+ , \
+ BOOST_PP_TUPLE_EAT(3) \
+ )(op_macro, params, BOOST_DETAIL_PP_SIGN_DEDUCED_PARAMS_FOLD_LEFT) \
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/access.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/access.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,26 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_HPP_
+
+#include "../aux_/parser/is_member.hpp" // For IS_ACCESS_TOKEN().
+#include "../aux_/parse/req.hpp"
+#include "../aux_/parse/not.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_REQ(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_ACCESS_TOKEN, \
+ ERROR_missing_public_protected_or_private_specifier)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_ACCESS_TOKEN, \
+ ERROR_unexpected_public_or_protected_or_private_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/base_types.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/base_types.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,111 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_HPP_
+
+#include "aux_/parse/until.hpp"
+#include "aux_/parse/return.hpp"
+#include "aux_/parser/is_member.hpp" // For `IS_ACCESS_TOKEN()`.
+#include "aux_/parser/is_ok.hpp"
+#include "aux_/parser/seq.hpp"
+#include "aux_/parser/seq_next.hpp"
+#include <boost/detail/preprocessor/keyword/is_static.hpp>
+#include <boost/detail/preprocessor/keyword/contract/is_invariant.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+// Predicate.
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_IS_TOKEN_(token) \
+ /* if token is (static) or (invariant), quit until-loop */ \
+ BOOST_PP_NOT(BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_STATIC(token) \
+ , BOOST_DETAIL_PP_KEYWORD_IS_INVARIANT(token) \
+ ))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_P_(n, seq_sign_err) \
+ BOOST_PP_IIF(BOOST_PP_NOT(BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_OK( \
+ seq_sign_err)), \
+ 0 /* if error, quit until-loop */ \
+ /* either no-token or static/invariant end base types */ \
+ , BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ /* size > 1 because (PP_NIL) always there */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ(seq_sign_err)), 1), \
+ /* one or more tokens (beside PP_NIL) left, inspect next token */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_IS_TOKEN_( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)) \
+ , \
+ 0 /* if no token left (beside PP_NIL), quit until-loop */ \
+ ))
+
+// Operation.
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_ERR_( \
+ n, seq_sign_err, error_message) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, error_message)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_CONCAT_(seq_sign_err) \
+ /* got here iff seq size > 2 for `(access)(base)... (NIL)` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_SET(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_REPLACE_BACK(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_BACK(seq_sign_err) \
+ /* seq append 2-tuple `( (access, base) )` */ \
+ (( \
+ /* seq next for `access` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT( \
+ seq_sign_err) \
+ , \
+ /* seq skip and next for `base` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( \
+ seq_sign_err \
+ )) \
+ )) \
+ )))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_CLASS_OK_( \
+ n, seq_sign_err, unused) \
+ /* got here iff sign size > 2 for `(publ|prot|priv)(base)... (NIL)` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( /* skip `(base)` */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( /* skip `(access)` */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_CONCAT_(seq_sign_err) \
+ ))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_ACCESS_OK_( \
+ n, seq_sign_err, unused) \
+ /* check seq size > 2 for `(access)(base)... (NIL)` */ \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ(seq_sign_err)), 2), \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_CLASS_OK_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_ERR_ \
+ )(n, seq_sign_err, ERROR_missing_base_class_type)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_(n, seq_sign_err) \
+ /* until gets here iff seq size > 1 for `(token)... (NIL)` */ \
+ /* check token is inheritance access public, protected, or private */ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_ACCESS_TOKEN( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_ACCESS_OK_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_ERR_ \
+ )(n, seq_sign_err, ERROR_missing_inheritance_access_level_public_protected_or_private)
+
+// Public APIs.
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL_WITH_OP(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_P_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_O_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/body.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/body.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_BODY_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_BODY_HPP_
+
+#include "../parser/seq.hpp"
+#include "../aux_/parse/return.hpp"
+#include "../aux_/parse/apply.hpp"
+#include <boost/detail/preprocessor/seq.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/remove.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BODY_OK_(seq_sign_err, body_index) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_OK(seq_sign_err, \
+ BOOST_PP_SEQ_ELEM(body_index, \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), \
+ BOOST_PP_SEQ_REMOVE(BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ seq_sign_err), body_index))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BODY_(seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_OK_(seq_sign_err, \
+ /* got here if !empty => size > 1 (>=2) as NIL always there, */ \
+ /* then it is safe to access the body as the 2nd last element */ \
+ /* (i.e., just before added trailing NIL) */ \
+ BOOST_PP_SUB(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 2))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BODY_EMPTY_(seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_body)
+
+// Differently from all other parses, the body is NOT parsed "in place". It
+// is instead always assumed to be at the back of seq (so the BACK postfix).
+// Thus, this parse operation can be safety used as the first one.
+#define BOOST_DETAIL_PP_SIGN_PARSE_BODY_BACK_REQ(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_APPLY_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_EMPTY_, \
+ ~)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_BODY_BACK_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_PP_NIL /* don't use EMPTY (for MSVC expansion issues) */ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/class_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/class_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,32 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_CLASS_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_CLASS_DECL_HPP_
+
+#include "../validate/class_decl.hpp"
+#include "finish.hpp"
+#include "invariant.hpp"
+#include "static_invariant.hpp"
+#include "base_types.hpp"
+#include "class_type.hpp"
+#include "start.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_CLASS_DECL(parenthesized_syntax_seq) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_CLASS_DECL( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_BASE_TYPES_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_CLASS_TYPE_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_NOEMPTY( \
+ parenthesized_syntax_seq, \
+ ERROR_missing_class_signature \
+ )))))))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/class_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/class_type.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_CLASS_TYPE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_CLASS_TYPE_HPP_
+
+#include "../aux_/parse/req.hpp"
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_CLASS_TYPE_ANY_TOKEN_(token) \
+ /* any non-empty token can be class-type */ \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(token))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_CLASS_TYPE_REQ(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_NOEMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_CLASS_TYPE_ANY_TOKEN_, \
+ ERROR_missing_class_type)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/const.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/const.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_CONST_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_CONST_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_const.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_CONST_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_CONST)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_CONST_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_CONST, \
+ ERROR_unexpected_const_qualifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/constructor_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/constructor_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,65 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_CONSTRUCTOR_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_CONSTRUCTOR_DECL_HPP_
+
+#include "../validate/constructor_decl.hpp"
+#include "finish.hpp"
+#include "postcondition.hpp"
+#include "ition.hpp"
+#include "initializers.hpp"
+#include "throw.hpp"
+#include "copyable.hpp"
+#include "volatile.hpp"
+#include "const.hpp"
+#include "function_params.hpp"
+#include "name.hpp"
+#include "result_type.hpp"
+#include "virtual.hpp"
+#include "static.hpp"
+#include "extern.hpp"
+#include "inline.hpp"
+#include "explicit.hpp"
+#include "requires.hpp"
+#include "template.hpp"
+#include "export.hpp"
+#include "access.hpp"
+#include "body.hpp"
+#include "start.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_CONSTRUCTOR_DECL( \
+ parenthesized_syntax_seq) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_CONSTRUCTOR_DECL( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH( \
+ BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_CONST_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_PARAMS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_NAME_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INLINE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_BACK_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_NOEMPTY( \
+ parenthesized_syntax_seq, \
+ ERROR_missing_constructor_signature \
+ )))))))))))))))))))))))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/copyable.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/copyable.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/contract/is_copyable.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_COPYABLE)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_COPYABLE, \
+ ERROR_unexpected_copyable_qualifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/destructor_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/destructor_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,65 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_DESTRUCTOR_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_DESTRUCTOR_DECL_HPP_
+
+#include "../validate/destructor_decl.hpp"
+#include "finished.hpp"
+#include "postcondition.hpp"
+#include "precondition.hpp"
+#include "initializers.hpp"
+#include "throw.hpp"
+#include "copyable.hpp"
+#include "volatile.hpp"
+#include "const.hpp"
+#include "function_params.hpp"
+#include "name.hpp"
+#include "result_type.hpp"
+#include "virtual.hpp"
+#include "static.hpp"
+#include "extern.hpp"
+#include "inline.hpp"
+#include "explicit.hpp"
+#include "requires.hpp"
+#include "template.hpp"
+#include "export.hpp"
+#include "access.hpp"
+#include "body.hpp"
+#include "start.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_DESTRUCTOR(parenthesized_syntax_seq) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_DESTRUCTOR_DECL( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISHED( \
+ BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_CONST_NOT( \
+ /* params req and then validate enforces empty params */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_PARAMS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_NAME_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INLINE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_BACK_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_NOEMPTY( \
+ parenthesized_syntax_seq, \
+ ERROR_missing_destructor_signature \
+ )))))))))))))))))))))))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/explicit.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/explicit.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_explicit.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_EXPLICIT)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_EXPLICIT, \
+ ERROR_unexpected_explicit_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/export.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/export.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_export.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_EXPORT)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_EXPORT, \
+ ERROR_unexpected_export_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/extern.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/extern.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_extern.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_EXTERN)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_EXTERN, \
+ ERROR_unexpected_extern_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/finish.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/finish.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,49 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_FINISH_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_FINISH_HPP_
+
+#include "../parser/seq.hpp"
+#include "../parser/sign.hpp"
+#include "../parser/err.hpp"
+#include <boost/preprocessor/seq/to_tuple.hpp>
+#include <boost/preprocessor/seq/seq.hpp> // For `PP_SEQ_TAIL()`.
+#include <boost/preprocessor/seq/to_array.hpp>
+
+// Signature is represented as a seq during parsing (for efficient push-back
+// operations) but it is represented as an array after parsing (for efficient
+// random access of signature traits). These convert signature seq to array.
+// NOTE: The array is used instead of a typle because sometimes the random
+// access is needed before the signature has been fully parsed. In these cases
+// the total size is not known a-priory so the array conversion will just use
+// the number of sign elems parsed so far and still allow for random access.
+
+// NOTE: These macro intentionally do not check for errors. Make sure
+// seq_sign_err is validated before it is passed to these macros.
+
+// Convert and return just sign. Err should be 0.
+#define BOOST_DETAIL_PP_SIGN_PARSE_FINISH_SIGN_(seq_sign_err) \
+ BOOST_PP_SEQ_TO_ARRAY(BOOST_PP_SEQ_TAIL( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err) \
+ /* terminate array with NIL to avoid EMPTY terminated arrays */ \
+ (BOOST_PP_NIL) \
+ ))
+
+// Convert sign and return (seq, converted-sign, err). If err != 0 it will be
+// returned as such but sign convertion will still be done.
+#define BOOST_DETAIL_PP_SIGN_PARSE_FINISH(seq_sign_err) \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH_SIGN_(seq_sign_err) \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/function_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/function_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,105 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_HPP_
+
+#include "../validate/member_decl.hpp"
+#include "../validate/nonmember_decl.hpp"
+#include "finish.hpp"
+#include "postcondition.hpp"
+#include "precondition.hpp"
+#include "initializers.hpp"
+#include "throw.hpp"
+#include "copyable.hpp"
+#include "volatile.hpp"
+#include "const.hpp"
+#include "function_params.hpp"
+#include "name.hpp"
+#include "result_type.hpp"
+#include "virtual.hpp"
+#include "static.hpp"
+#include "extern.hpp"
+#include "inline.hpp"
+#include "explicit.hpp"
+#include "requires.hpp"
+#include "template.hpp"
+#include "export.hpp"
+#include "access.hpp"
+#include "body.hpp"
+#include "start.hpp"
+#include "../aux_/parser/is_member.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_MEMBER_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_MEMBER_DECL( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH( \
+ BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_CONST_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_PARAMS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_NAME_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INLINE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_BACK_REQ( \
+ seq_sign_err \
+ ))))))))))))))))))))))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_NONMEMBER_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_NONMEMBER_DECL( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH( \
+ BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_CONST_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_PARAMS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_NAME_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INLINE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_BACK_REQ( \
+ seq_sign_err \
+ ))))))))))))))))))))))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_(seq_sign_err) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_AUX_PARSER_IS_MEMBER(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_MEMBER_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_NONMEMBER_ \
+ )(seq_sign_err)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL(parenthesized_syntax_seq) \
+ BOOST_DETAIL_PP_SIGN_PARSE_FUNCTION_DECL_( \
+ BOOST_DETAIL_PP_SIGN_PARSER_START( \
+ parenthesized_syntax_seq, \
+ ERROR_missing_function_signature \
+ ))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/initializers.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/initializers.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,52 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_HPP_
+
+#include "../parser/seq.hpp"
+#include "../aux_/parse/until.hpp"
+#include "../aux_/parse/return.hpp"
+#include <boost/detail/preprocessor/keyword/contract/is_precondition.hpp>
+#include <boost/detail/preprocessor/keyword/contract/is_postcondition.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_IS_TOKEN_(token) \
+ /* if token is (precondition) or (postcondition), quit until-loop */ \
+ BOOST_PP_NOT(BOOST_PP_OR( \
+ BOOST_DETAIL_PP_KEYWORD_IS_PRECONDITION(token) \
+ , BOOST_DETAIL_PP_KEYWORD_IS_POSTCONDITION(token)) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_P_(n, seq_sign_err) \
+ /* body parsed first so either no-token or pre/post end initializers */ \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE( \
+ /* size > 1 because (PP_NIL) always there */ \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err)), 1), \
+ /* one or more tokens (beside PP_NIL) left, inspect next token */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_IS_TOKEN_( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT(seq_sign_err)) \
+ , \
+ 0 /* if no token left (beside PP_NIL), quit until-loop */ \
+ ) /* do not delay macro expansion here (for MSVC) */
+
+// Public API.
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_UNTIL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_P_)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ (BOOST_PP_NIL) /* empty initializers seq `(NIL)`*/ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/inline.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/inline.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_INLINE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_INLINE_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_inline.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INLINE_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_INLINE)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INLINE_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_INLINE, \
+ ERROR_unexpected_inline_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/invariant.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,34 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_HPP_
+
+#include "../aux_/parse/tagged_opt.hpp"
+#include "../aux_/parse/return.hpp"
+#include <boost/detail/preprocessor/keyword/contract/is_invariant.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_OPT_ONEMPTY_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_PARSER_RETURN_ERR(seq_sign_err, \
+ ERROR_cannot_specify_invariant_with_no_assertion)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_OPT_ISEMPTY_(seq) \
+ BOOST_PP_NOT(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_INVARIANT, \
+ (BOOST_PP_NIL), /* if no (invariant), no assertions */ \
+ /* handle (invariant)() empty seq (on C99) */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_OPT_ISEMPTY_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_INVARIANT_OPT_ONEMPTY_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/name.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/name.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,26 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_NAME_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_NAME_HPP_
+
+#include "../aux_/parse/req.hpp"
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_NAME_ANY_TOKEN_(token) \
+ /* any non-empty token can be a name */ \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(token))
+
+// Parse the operation name (for functions/operators, constructors, etc).
+#define BOOST_DETAIL_PP_SIGN_PARSE_NAME_REQ(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_NOEMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_NAME_ANY_TOKEN_, \
+ ERROR_missing_name_for_function_or_operator_or_constructor_or_destructor)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/params.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/params.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_HPP_
+
+#include "../aux_/parse/all_params/params.hpp"
+#include "../aux_/parse/req.hpp"
+#include "../aux_/parser/merge.hpp"
+#include "../aux_/parser/seq_next.hpp"
+#include "../aux_/parser/seq_skip.hpp"
+#include "../parser/seq.hpp"
+
+// Parse operation params (for func/operator, constr, destr, etc).
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_OP_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_PARAMS( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT( \
+ seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ /* skip already parsed ( param-seq ) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( \
+ seq_sign_err)))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_ANY_TOKEN_(token) \
+ 1 /* accept any token (even empty) as param seq to be parsed */
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_REQ(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_OP(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_ANY_TOKEN_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_OP_, \
+ ERROR_missing_function_parameters)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/postcondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/postcondition.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDTION_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDTION_HPP_
+
+#include "finish.hpp"
+#include "../aux_/parse/postcondition/with_result.hpp"
+#include "../aux_/parse/postcondition/without_result.hpp"
+#include "../aux_/parse/return.hpp"
+#include "../aux_/parse/tagged_not.hpp"
+#include "../result_type.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_OPT(seq_sign_err) \
+ /* if got here, no sse err -- decide if result is void or not */ \
+ /* LIMITATION: This code will detect a `void` result based just on */ \
+ /* matching the `void` token itself. This does not check the type (at */ \
+ /* compile time) but instead the token itself (at preprocessing time). */ \
+ /* the token can be `myvoid` where `typedef void myvoid` so it will */ \
+ /* not be detected as `void` even if it is void type -- in this case */ \
+ /* it is possible to force void result by specifying `void` as the */ \
+ /* result name in the postconditions. On the other end, `void*` is not */ \
+ /* will be matched as a void result type even if it is not -- in this */ \
+ /* case the user can use `void_ptr` instead of `void*` where */ \
+ /* `typedef void* void_ptr`. */ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_IS_VOID_RESULT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH(seq_sign_err)), \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITHOUT_RESULT \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_POST_WITH_RESULT \
+ )(seq_sign_err)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_NOT_RESULT_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_PP_EMPTY) /* no result-name token */
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_NOT(seq_sign_err) \
+ /* make sure there is no postcondition code block */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_NOT_RESULT_( \
+ seq_sign_err), \
+ BOOST_DETAIL_PP_KEYWORD_IS_POSTCONDITION, \
+ (BOOST_PP_NIL), /* no postcondition seq */ \
+ ERROR_unexpected_postconditions)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/precondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/precondition.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_PRECONDTION_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_PRECONDTION_HPP_
+
+#include "../aux_/parse/return.hpp"
+#include "../aux_/parse/tagged_opt.hpp"
+#include "../aux_/parse/tagged_not.hpp"
+#include <boost/detail/preprocessor/keyword/contract/is_precondition.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT_ONEMPTY_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_cannot_specify_precondition_with_no_assertion)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT_ISEMPTY_(seq) \
+ BOOST_PP_NOT(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_PRECONDITION, \
+ (BOOST_PP_NIL), /* if no (precondition), no assertions */ \
+ /* handle (precondition)() empty seq (on C99) */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT_ISEMPTY_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_OPT_ONEMPTY_)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_PRECONDITION, \
+ (BOOST_PP_NIL), /* no prepcondition seq */ \
+ ERROR_unexpected_preconditions)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/requires.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/requires.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,40 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_HPP_
+
+#include "../aux_/parse/tagged_opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include "../aux_/parse/return.hpp"
+#include <boost/detail/preprocessor/keyword/concept/is_requires.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT_ONEMPTY_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, \
+ ERROR_cannot_specify_requires_with_no_concept)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT_ISEMPTY_(seq) \
+ BOOST_PP_NOT(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_REQUIRES, \
+ (BOOST_PP_NIL), /* if no (requires), no concepts */ \
+ /* handle (requires)() empty seq (on C99) */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT_ISEMPTY_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_OPT_ONEMPTY_)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_WITH_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_REQUIRES, \
+ (BOOST_PP_NIL), /* no requires and no concepts */ \
+ ERROR_unexpected_requires_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/result_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/result_type.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,28 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_HPP_
+
+#include "../aux_/parse/req.hpp"
+#include "../aux_/parse/return.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_ANY_TOKEN_(token) \
+ 1 /* always true for any token can be result-type */
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_REQ(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_REQ_NOEMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_ANY_TOKEN_, \
+ ERROR_missing_result_type)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_NOT(seq_sign_err) \
+ /* cannot use PARSER_NOT because any token can be result */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ void) /* no result must be `void` result */
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/start.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/start.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,71 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_START_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_START_HPP_
+
+#include "../aux_/parser/sign_nil.hpp"
+#include "../aux_/parser/err_msg.hpp"
+#include "../aux_/parser/err_none.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+
+// If no error, specify error = (0, ...). Seq cannot be empty -- use (NIL).
+#define BOOST_DETAIL_PP_SIGN_PARSE_START_(seq, err) \
+ ( \
+ seq /* cannot be empty seq (must have already added NIL) */ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL \
+ , \
+ err \
+ )
+
+// If non empty seq (size > 0) has empty elem `()...`.
+#define BOOST_DETAIL_PP_SIGN_PARSE_START_IS_SEQ_EMPTY_ELEM_(seq) \
+ BOOST_PP_IIF(BOOST_PP_IS_EMPTY(BOOST_PP_SEQ_ELEM(0, seq)), \
+ 1 /* seq elem is empty `()...` */ \
+ , \
+ 0 \
+ )
+
+// If seq is empty -- either emopty seq `` or empty elem `()...` (C99 only).
+#define BOOST_DETAIL_PP_SIGN_PARSE_START_IS_SEQ_EMPTY_(seq) \
+ BOOST_PP_IF(BOOST_PP_SEQ_SIZE(seq), \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_IS_SEQ_EMPTY_ELEM_ \
+ , \
+ 1 /* seq itself is empty `` (size == 0) */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(seq)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_START_HANDLE_EMPTY_(seq, empty_err) \
+ BOOST_PP_EXPAND( \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSE_START_IS_SEQ_EMPTY_(seq), \
+ /* (NIL) to handle empty seq */ \
+ ( (BOOST_PP_NIL), empty_err ) \
+ , \
+ /* (NIL) to be consistent with empty seq "last elem is NIL" */ \
+ ( seq (BOOST_PP_NIL), BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_NONE ) \
+ ))
+
+// Allow seq to be empty.
+#define BOOST_DETAIL_PP_SIGN_PARSE_START(seq) \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_HANDLE_EMPTY_(seq, \
+ /* no error even if empty */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_NONE)
+
+// If seq is empty, report specified `empty_error`.
+#define BOOST_DETAIL_PP_SIGN_PARSE_START_NOEMPTY(seq, empty_error_msg) \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_HANDLE_EMPTY_(seq, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_MSG(empty_error_msg))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/static.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/static.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_STATIC_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_static.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_STATIC)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_STATIC, \
+ ERROR_unexpected_static_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/static_invariant.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/static_invariant.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,54 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_HPP_
+
+#include "../aux_/parser/sign_replace_back.hpp"
+#include "../aux_/parser/sign_back.hpp"
+#include "../aux_/parser/seq_skip.hpp"
+#include "../aux_/parse/tagged_req.hpp"
+#include "../aux_/parse/if.hpp"
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_IS_EMPTYSEQ_(seq) \
+ BOOST_PP_NOT(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_REQ_PREPEND_NIL_( \
+ seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_REPLACE_BACK(seq_sign_err, \
+ (BOOST_PP_NIL) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_BACK(seq_sign_err)) \
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_REQ_( \
+ seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_REQ_PREPEND_NIL_( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_REQ( \
+ /* skip (static) (tagged_req use APPLY to hanlde EMPTY) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP(seq_sign_err), \
+ BOOST_DETAIL_PP_KEYWORD_IS_INVARIANT, \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_IS_EMPTYSEQ_, \
+ ERROR_expected_static_class_invariants_after_static) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_EMPTY_( \
+ seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ (BOOST_PP_NIL) /* no static-invariant assertions */ )
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_EMPTY_, \
+ BOOST_DETAIL_PP_KEYWORD_IS_STATIC, \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_REQ_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_INVARIANT_EMPTY_ \
+ , ~)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/template.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/template.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,55 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_HPP_
+
+#include "../parser/seq.hpp"
+#include "../aux_/parser/sign_nil.hpp"
+#include "../aux_/parser/merge.hpp"
+#include "../aux_/parser/seq_next.hpp"
+#include "../aux_/parser/seq_skip.hpp"
+#include "../aux_/parse/if.hpp"
+#include "../aux_/parse/not.hpp"
+#include "../aux_/parse/all_params/tparams.hpp"
+#include <boost/detail/preprocessor/keyword/is_template.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_NO_(seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_STILL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL /* no tparams */ )
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_YES_(seq_sign_err, unused) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_MERGE(seq_sign_err, \
+ /* after (template), parse template params */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_TPARAMS( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_NEXT( \
+ /* skip already parsed (template) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( \
+ seq_sign_err))), \
+ BOOST_DETAIL_PP_SIGN_PARSER_SEQ( \
+ /* skip already parsed (template)( tparam-seq ) */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_SKIP( \
+ seq_sign_err))) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_IF(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_TEMPLATE, \
+ BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_YES_ \
+ , \
+ BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_NO_ \
+ , ~)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_WITH_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_TEMPLATE, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_NIL /* no tparams */, \
+ ERROR_unexpected_template_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/throw.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/throw.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,38 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_THROW_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_THROW_HPP_
+
+#include "../aux_/parse/tagged_opt.hpp"
+#include "../aux_/parse/return.hpp"
+#include <boost/detail/preprocessor/keyword/is_throw.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT_EMPTYSEQ_(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_FWD(seq_sign_err, (void) )
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT_ISEMPTY_(seq) \
+ BOOST_PP_NOT(BOOST_PP_SEQ_SIZE(seq))
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_TAGGED_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_THROW, \
+ (BOOST_PP_NIL), /* if no (throw), no execption specs */ \
+ /* handle (throw)() as (throw)( (void) ) (on C99) */ \
+ BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT_ISEMPTY_, \
+ BOOST_DETAIL_PP_SIGN_PARSE_THROW_OPT_EMPTYSEQ_)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_THROW_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT_WITH_EMPTY(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_THROW, \
+ (BOOST_PP_NIL), /* no throw and no exception specs */ \
+ ERROR_unexpected_throw_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/virtual.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/virtual.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_virtual.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_VIRTUAL)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_VIRTUAL, \
+ ERROR_unexpected_virtual_specifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parse/volatile.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parse/volatile.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_HPP_
+
+#include "../aux_/parse/opt.hpp"
+#include "../aux_/parse/not.hpp"
+#include <boost/detail/preprocessor/keyword/is_volatile.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_OPT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_OPT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_VOLATILE)
+
+#define BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_NOT(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_NOT(seq_sign_err, \
+ BOOST_DETAIL_PP_KEYWORD_IS_VOLATILE, \
+ ERROR_unexpected_volatile_qualifier)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parser/apply.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parser/apply.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,41 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSER_APPLY_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSER_APLLY_HPP_
+
+#include "sign.hpp"
+#include "err.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSER_APPLY_OK_( \
+ seq_sign_err, op_macro, err_macro, data) \
+ op_macro(BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err), data)
+
+#define BOOST_DETAIL_PP_SIGN_PARSER_APPLY_ERR_( \
+ seq_sign_err, op_macro, err_macro, data) \
+ err_macro(BOOST_DETAIL_PP_SIGN_PARSER_ERR_MESSAGE(seq_sign_err), data)
+
+// Apply specified operation macro: If no error then expand to
+// `op_macro(sign, data)`, else to `err_macro(message, data)` (where
+// `message` is a valid concatenable pp single token like `ERROR_abc_xyz`).
+// This can be used to process parsed signature via `op_macro()` while ensuring
+// parsing macro (usually computationally expensive) is expanded only once:
+// #define PARSE_(seq) ... // Parse `seq` into `sign_seq_err`.
+// #define CODE_(sign, data) ... // Generate code from parsed signature.
+// #define ERR_(msg, data) ; BOOST_MPL_ASSERT_MSG(false, msg, ()) ;
+// #define CODE(seq) PP_SIGN_PARSE_APPLY(PARSE_(seq), CODE_, ERR_, ~)
+#define BOOST_DETAIL_PP_SIGN_PARSER_APPLY( \
+ seq_sign_err, op_macro, err_macro, data) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ BOOST_DETAIL_PP_SIGN_PARSER_APPLY_ERR_ /* expand to error */ \
+ , /* else */ \
+ BOOST_DETAIL_PP_SIGN_PARSER_APPLY_OK_ /* expand to code */ \
+ )(seq_sign_err, op_macro, err_macro, data)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parser/err.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parser/err.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,54 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSER_ERR_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_HPP_
+
+#include "../aux_/parser/indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+
+// NOTE: I tried to use the tokens `[message] BOOST_PP_EMPTY` instead of the
+// 2-tuple to represent errors (where there was an error iff message was
+// present and therefore the expanded token expression was not empty). However,
+// this caused macros expansion problems in MSVC. It is actually specified in
+// Boost.Preprocessor documentation that the behavior of some BOOST_PP_...
+// macros is undefined when BOOST_PP_EMPTY is explicitly passed as a macro
+// parameter. Therefore, this use of BOOST_PP_EMPTY to represent errors must be
+// avoided. Plus, it is probably more efficient to check if err_code != 0 than
+// if the token expression is EMPTY to see if there was an error.
+
+// Error is a 2-tuple `(code, message)` where there is an error iff code != 0.
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_CODE_INDEX_ 0
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_MSG_INDEX_ 1
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_INDEX_MAX_ 2
+
+// Public API.
+
+// This API could be made private (i.e., moved into "aux_/") because users
+// should always access the error via the other macros below (code, message,
+// etc). However, it is provided here for maximum flexibility to the users
+// (and because it is not a secret that `seq_sign_err` has an error component).
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARSER_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_ERR_INDEX, seq_sign_err)
+
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_CODE(seq_sign_err) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_PARSER_ERR_INDEX_MAX_, \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR_CODE_INDEX_, \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err))
+
+#define BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err) \
+ BOOST_PP_BOOL(BOOST_DETAIL_PP_SIGN_PARSER_ERR_CODE(seq_sign_err))
+
+#define BOOST_DETAIL_PP_SIGN_PARSER_ERR_MESSAGE(seq_sign_err) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_PARSER_ERR_INDEX_MAX_, \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR_MSG_INDEX_, \
+ BOOST_DETAIL_PP_SIGN_PARSER_ERR(seq_sign_err))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parser/seq.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parser/seq.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,23 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSER_SEQ_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSER_SEQ_HPP_
+
+#include "../aux_/parser/indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+
+// This API could be made private (i.e., moved into "aux_/") but it is provided
+// here for maximum flexibility to the users which might want to show the
+// parenthsized syntax sequence left to be parsed for example in case of an
+// error.
+#define BOOST_DETAIL_PP_SIGN_PARSER_SEQ(seq_sign_err) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARSER_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SEQ_INDEX, seq_sign_err)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/parser/sign.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/parser/sign.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,19 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PARSER_SIGN_HPP_
+#define BOOST_DETAIL_PP_SIGN_PARSER_SIGN_HPP_
+
+#include "../aux_/parser/indexes.hpp"
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err) \
+ BOOST_PP_TUPLE_ELEM(BOOST_DETAIL_PP_SIGN_AUX_PARSER_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSER_SIGN_INDEX, seq_sign_err)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/postcondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/postcondition.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,59 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_POSTCONDITION_HPP_
+#define BOOST_DETAIL_PP_SIGN_POSTCONDITION_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/detail/preprocessor/keyword/is_void.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// Postconditions' result.
+
+#define BOOST_DETAIL_PP_SIGN_POSTCONDITION_RESULT(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_POSTCONDITION_RESULT_ID, sign) \
+ (/* expand empty */)
+
+// Expand to 1 iff has a result-name (but it could be `void`). result-name ==
+// `void` must be allowed to handle `typedef void myvoid;` and similar.
+#define BOOST_DETAIL_PP_SIGN_POSTCONDITION_HAS_RESULT(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY( \
+ BOOST_DETAIL_PP_SIGN_POSTCONDITION_RESULT(sign)))
+
+#define BOOST_DETAIL_PP_SIGN_POSTCONDITION_IS_RESULT_NONVOID_(sign) \
+ /* if got here, result not empty */ \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_KEYWORD_IS_VOID( \
+ BOOST_DETAIL_PP_SIGN_POSTCONDITION_RESULT(sign)))
+
+#define BOOST_DETAIL_PP_SIGN_POSTCONDITION_HAS_NONVOID_RESULT(sign) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_POSTCONDITION_HAS_RESULT(sign), \
+ /* has result-name then check if result-name == `void` or not */ \
+ BOOST_DETAIL_PP_SIGN_POSTCONDITION_IS_RESULT_NONVOID_ \
+ , \
+ 0 /* has no result-name so doesn't have result-name != `void` */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+// Postconditions.
+
+#define BOOST_DETAIL_PP_SIGN_POSTCONDITION(sign) \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ(BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_POSTCONDITION_INDEX, sign))
+
+#define BOOST_DETAIL_PP_SIGN_HAS_POSTCONDITION(sign) \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_POSTCONDITION_ID, sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/precondition.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/precondition.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_PRECONDITION_HPP_
+#define BOOST_DETAIL_PP_SIGN_PRECONDITION_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_PRECONDITION(sign) \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ(BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PRECONDITION_INDEX, sign))
+
+#define BOOST_DETAIL_PP_SIGN_HAS_PRECONDITION(sign) \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_PRECONDITION_INDEX, \
+ sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/requires.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/requires.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_REQUIRES_HPP_
+#define BOOST_DETAIL_PP_SIGN_REQUIRES_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_REQUIRES(sign) \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_REQUIRES_INDEX, sign))
+
+#define BOOST_DETAIL_PP_SIGN_HAS_REQUIRES(sign) \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_REQUIRES_INDEX, sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/result_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/result_type.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,30 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_RESULT_TYPE_HPP_
+#define BOOST_DETAIL_PP_SIGN_RESULT_TYPE_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/keyword/is_void.hpp>
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_RESULT_TYPE(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_RESULT_TYPE_INDEX, sign)
+
+#define BOOST_DETAIL_PP_SIGN_IS_VOID_RESULT(sign) \
+ BOOST_DETAIL_PP_KEYWORD_IS_VOID(BOOST_DETAIL_PP_SIGN_RESULT_TYPE( \
+ sign))
+
+// Constructors and destructors have no result.
+#define BOOST_DETAIL_PP_SIGN_HAS_RESULT(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_RESULT(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/static.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/static.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_STATIC_HPP_
+#define BOOST_DETAIL_PP_SIGN_STATIC_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_STATIC(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_STATIC_INDEX, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_STATIC(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_STATIC(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/template_params.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/template_params.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,33 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_TEMPLATE_PARAMS_HPP_
+#define BOOST_DETAIL_PP_SIGN_TEMPLATE_PARAMS_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include "aux_/parsed/params_indexes.hpp"
+#include <boost/preprocessor/facilities/empty.hpp>
+
+// Function template parameters.
+
+#define BOOST_DETAIL_PP_SIGN_TEMPLATE_PARAMS(sign) \
+ /* params represented as 3-array `(3, (tag, induced, deduced))` */ \
+ (BOOST_DETAIL_PP_SIGN_AUX_PARSED_PARAMS_INDEX_MAX, \
+ ( \
+ BOOST_PP_EMPTY /* no tag for tparams */ \
+ , \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( /* tparams as induced */ \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_TEMPLATE_PARAMS_INDEX, \
+ sign) \
+ , \
+ (BOOST_PP_NIL) /* no deduced for tparams */ \
+ ) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/throw.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/throw.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,53 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_THROW_HPP_
+#define BOOST_DETAIL_PP_SIGN_THROW_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/detail/preprocessor/keyword/is_void.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// Sequence of specificed exceptions (if has throw and is not throw nothing).
+#define BOOST_DETAIL_PP_SIGN_THROW(sign) \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_THROW_ID, sign))
+
+// Expand to 1 iff exception specs present (could throw nothing or something).
+#define BOOST_DETAIL_PP_SIGN_HAS_THROW(sign) \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_THROW_INDEX, sign)))
+
+#define BOOST_DETAIL_PP_SIGN_IS_THROW_NOTHING_(sign) \
+ /* got here iff seq size == 2 for `(NIL) (elem0)` */ \
+ BOOST_DETAIL_PP_KEYWORD_IS_VOID(BOOST_PP_SEQ_ELEM(1, \
+ BOOST_DETAIL_PP_SIGN_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_PARSED_THROW_INDEX, sign)))
+
+// Expand to 1 iff exception specs throw nothing `throw()`.
+#define BOOST_DETAIL_PP_SIGN_IS_THROW_NOTHING(sign) \
+ /* throw nothing iff `(NIL) (void)` */ \
+ BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_PARSED_THROW_INDEX, sign)), 2), \
+ BOOST_DETAIL_PP_SIGN_IS_THROW_NOTHING_ \
+ , \
+ 0 /* if size != 2, no throw specs (size 1) or throw some (size > 2) */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(sign)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/validate/basic.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/validate/basic.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,61 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_HPP_
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_HPP_
+
+#include "return.hpp"
+#include "../parser/err.hpp"
+#include "../parser/seq.hpp"
+#include "../aux_/parsed/count.hpp"
+#include "../aux_/parsed/indexes.hpp"
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/comparison/not_equal.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// First applies common validation checks, if they pass apply additional
+// validation checks as defined by the user in `validation_macro(seq_sign_err)`.
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC( \
+ seq_sign_err, sign_count, validation_macro) \
+ /* common validation checks */ \
+ /* forward existing error (if any) */ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARSER_HAS_ERR(seq_sign_err), \
+ seq_sign_err \
+ BOOST_PP_TUPLE_EAT(1) \
+ /* when done, only seq elem left should be NIL (size != 1 invalid) */ \
+ , BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(BOOST_PP_SEQ_SIZE( \
+ BOOST_DETAIL_PP_SIGN_PARSED_SEQ(seq_sign_err)), 1), \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_ERR(seq_sign_err, \
+ ERROR_unable_to_parse_all_tokens_because_of_invalid_syntax_or_order) \
+ BOOST_PP_TUPLE_EAT(1) \
+ /* when done, exactly ID_MAX elems in sign */ \
+ , BOOST_PP_IIF(BOOST_PP_NOT_EQUAL( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_COUNT(seq_sign_err), \
+ sign_count), \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_ERR(seq_sign_err, \
+ ERROR_missing_one_or_more_signature_tokens) \
+ BOOST_PP_TUPLE_EAT(1) \
+ , /* user defined validation checks */ \
+ validation_macro \
+ )))(seq_sign_err)
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_DECL( \
+ seq_sign_err, validation_macro) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_INDEX_MAX, \
+ validation_macro)
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_CLASS_DECL( \
+ seq_sign_err, validation_macro) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_INDEX_MAX, \
+ validation_macro)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/validate/class_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/validate/class_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef CONTRACT_DECL_PP_SIGN_VALIDATE_CLASS_DECL_HPP_
+#define CONTRACT_DECL_PP_SIGN_VALIDATE_CLASS_DECL_HPP_
+
+#include "basic.hpp"
+#include "return.hpp"
+#include "../aux_/parsed/indexes.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_CLASS_DECL(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_CLASS_DECL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_CLASS_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_OK)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/validate/constructor_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/validate/constructor_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_VALIDATE_CONSTRUCTOR_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_CONSTRUCTOR_DECL_HPP_
+
+#include "basic.hpp"
+#include "return.hpp"
+#include "../aux_/parsed/indexes.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_CONSTRUCTOR_DECL(seq_sign_err) \
+ CONTRACT_DECL_PP_SIGN_VALIDATE_BASIC_DECL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_OK)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/validate/destructor_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/validate/destructor_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_VALIDATE_DESTRUCTOR_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_DESTRUCTOR_DECL_HPP_
+
+#include "basic.hpp"
+#include "return.hpp"
+#include "../function_params.hpp"
+#include "../params/size.hpp"
+#include "../parser/sign.hpp"
+#include <boost/preprocessor/control/if.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_DESTRUCTOR_DECL_(seq_sign_err) \
+ /* got here iff `seq_sign_err` is OK (no error) */ \
+ /* destructor must have no func params */ \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE( \
+ BOOST_DETAIL_PP_SIGN_FUNCTION_PARAMS( \
+ BOOST_DETAIL_PP_SIGN_PARSER_SIGN(seq_sign_err))), \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_ERR(seq_sign_err, \
+ ERROR_destructor_cannot_have_parameters) \
+ , /* else, no error */ \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_OK(seq_sign_err) \
+ )
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_DESTRUCTOR_DECL(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_DECL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_DESTRUCTOR_DECL_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/validate/member_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/validate/member_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_VALIDATE_MEMBER_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_MEMBER_DECL_HPP_
+
+#include "basic.hpp"
+#include "return.hpp"
+#include "../aux_/parsed/indexes.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_MEMBER_DECL(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_DECL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_AUX_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_OK)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/validate/nonmember_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/validate/nonmember_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_VALIDATE_NONMEMBER_DECL_HPP_
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_NONMEMBER_DECL_HPP_
+
+#include "basic.hpp"
+#include "return.hpp"
+#include "../aux_/parsed/indexes.hpp"
+
+#define BOOST_DETAIL_PP_SIGN_VALIDATE_NONMEMBER_DECL(seq_sign_err) \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_BASIC_DECL(seq_sign_err, \
+ BOOST_DETAIL_PP_SIGN_PARSED_INDEX_MAX, \
+ BOOST_DETAIL_PP_SIGN_VALIDATE_RETURN_OK)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/validate/return.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/validate/return.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef CONTRACT_AUX_PP_SIGN_VALIDATE_RETURN_HPP_
+#define CONTRACT_AUX_PP_SIGN_VALIDATE_RETURN_HPP_
+
+#include "../aux_/parse/return.hpp"
+
+#define CONTRACT_AUX_PP_SIGN_VALIDATE_RETURN_OK(seq_sign_err) \
+ seq_sign_err /* ok (no error, simply return seq_sign_err) */
+
+#define CONTRACT_AUX_PP_SIGN_VALIDATE_RETURN_ERR(seq_sign_err, error_message) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSE_RETURN_ERR(seq_sign_err, error_message)
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/virtual.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/virtual.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_VIRTUAL_HPP_
+#define BOOST_DETAIL_PP_SIGN_VIRTUAL_HPP_
+
+#include "aux_/parsed/elem.hpp"
+#include "aux_/parsed/indexes.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_VIRTUAL(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_VIRTUAL_INDEX, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_VIRTUAL(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_VIRTUAL(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/preprocessor/sign/volatile.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/preprocessor/sign/volatile.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,25 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_DETAIL_PP_SIGN_VOLATILE_HPP_
+#define BOOST_DETAIL_PP_SIGN_VOLATILE_HPP_
+
+#include "ayx_/parsed/elem.hpp"
+#include "ayx_/parsed/indexes.hpp"
+#include <boost/preprocessor/facilities/is_empty.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+
+#define BOOST_DETAIL_PP_SIGN_VOLATILE(sign) \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_ELEM( \
+ BOOST_DETAIL_PP_SIGN_AUX_PARSED_VOLATILE_INDEX, sign) \
+ (/* expand empty */)
+
+#define BOOST_DETAIL_PP_SIGN_IS_VOLATILE(sign) \
+ BOOST_PP_NOT(BOOST_PP_IS_EMPTY(BOOST_DETAIL_PP_SIGN_VOLATILE(sign)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/detail/type_traits/add_pointed_const.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/type_traits/add_pointed_const.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,34 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef CONTRACT_DETAIL_POINTER_TRAITS_HPP_
+#define CONTRACT_DETAIL_POINTER_TRAITS_HPP_
+
+namespace contract { namespace detail {
+
+// Metafunction to add const to pointed type `T` (i.e. converts
+// `T* [const]` to `T const* [const]`).
+// NOTE: `boost::add_const<>` cannot be used instead because only adds outer
+// const.
+
+template<typename T> struct add_pointed_const { typedef T type; };
+
+template<typename T> struct add_pointed_const<T*> { typedef T const* type; };
+
+template<typename T> struct add_pointed_const<T const*>
+ { typedef T const* type; };
+
+template<typename T> struct add_pointed_const<T* const>
+ { typedef T const* const type; };
+
+template<typename T> struct add_pointed_const<T const* const>
+ { typedef T const* const type; };
+
+}} // namespace
+
+#endif //#include guard
+

Added: sandbox/local/boost/detail/type_traits/is_inner_const.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/detail/type_traits/is_inner_const.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,43 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef CONTRACT_DETAIL_TYPE_TRAITS_IS_INNER_CONST_HPP_
+#define CONTRACT_DETAIL_TYPE_TRAITS_IS_INNER_CONST_HPP_
+
+#include <boost/mpl/bool.hpp>
+
+namespace contract { namespace detail {
+
+// Metafunction to check if type has inner const.
+// NOTE: `boost::is_const<>` cannot be used instead because it checks just
+// for outer `const`.
+
+template<typename T> struct is_inner_const: boost::mpl::false_ {};
+
+// Inner equals outer `const` in this case (there is only one `const`).
+template<typename T> struct is_inner_const<T const>: boost::mpl::true_ {};
+
+template<typename T> struct is_inner_const<T&>: boost::mpl::false_ {};
+
+template<typename T> struct is_inner_const<T const&>: boost::mpl::true_ {};
+
+// No specialization for `T& const` because not a valid type.
+// No specialization for `T const& const` because not a valid type.
+
+template<typename T> struct is_inner_const<T*>: boost::mpl::false_ {};
+
+template<typename T> struct is_inner_const<T const*>: boost::mpl::true_ {};
+
+template<typename T> struct is_inner_const<T* const>: boost::mpl::false_ {};
+
+template<typename T> struct is_inner_const<T const* const>:
+ boost::mpl::true_ {};
+
+}} // namespace
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/block.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/block.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_BLOCK_HPP_
+#define BOOST_LOCAL_AUX_BLOCK_HPP_
+
+#include "symbol.hpp"
+
+// Users can exit a local block (and not enclosing function) using `return;`.
+#define BOOST_LOCAL_AUX_BLOCK( \
+ local_function_macro, parenthesized_binding) \
+ { /* start new code block to reuse same local function name */ \
+ local_function_macro( \
+ (void) (BOOST_LOCAL_AUX_SYMBOL_BLOCK_FUNCTION_NAME)( \
+ parenthesized_binding \
+ ) \
+ ) /* user block code `{ ... }` here */
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/exit.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/exit.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,44 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_EXIT_HPP_
+#define BOOST_LOCAL_AUX_EXIT_HPP_
+
+#include "symbol.hpp"
+#include "../function_ref.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+#define BOOST_LOCAL_AUX_EXIT_NAME(name) \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(BOOST_PP_CAT(BOOST_PP_CAT( \
+ BOOST_PP_CAT(exit, BOOST_LOCAL_AUX_SYMBOL_INFIX), \
+ name), __LINE__))
+
+// Users can exit local scope (and not enclosing function) using `return;`
+// (same as with Boost.ScopeExit).
+#define BOOST_LOCAL_AUX_EXIT(local_function_macro, \
+ parenthesized_binding) \
+ local_function_macro( \
+ (void) (BOOST_LOCAL_AUX_EXIT_NAME(function))( \
+ parenthesized_binding ) \
+ ) /* user code block `{ ... }` here */
+
+namespace boost { namespace local { namespace aux {
+
+// Resource destructor exec exit code when obj goes out of local scope.
+struct exit_guard {
+ // Exit local functions are always void with no params (and no defaults).
+ typedef ::boost::local::function_ref<void ()> ref_type;
+ explicit exit_guard(ref_type ref): ref_(ref) {}
+ ~exit_guard() { ref_(); }
+private:
+ ref_type ref_;
+};
+
+}}} // namespace boost::local::aux
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/file.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/file.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,18 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_FILE_HPP_
+#define BOOST_LOCAL_AUX_FILE_HPP_
+
+#define BOOST_LOCAL_AUX_FILE_FUNCTION_BASE_HPP \
+ "boost/local/aux_/function/base.hpp"
+
+#define BOOST_LOCAL_AUX_FILE_FUNCTION_REF_HPP \
+ "boost/local/aux_/function_ref.hpp"
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/function/base.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/function/base.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,83 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef BOOST_LOCAL_AUX_FUNCTION_BASE_HPP_
+# define BOOST_LOCAL_AUX_FUNCTION_BASE_HPP_
+
+# include "../file.hpp"
+# include "../../config.hpp"
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/arithmetic/sub.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/cat.hpp>
+
+#define BOOST_LOCAL_arg_type(z, arg_n, unused) \
+ BOOST_PP_CAT(A, arg_n)
+
+#define BOOST_LOCAL_arg_typename(z, arg_n, unused) \
+ typename BOOST_LOCAL_arg_type(z, arg_n, unused)
+
+#define BOOST_LOCAL_operator_call(z, defaults_n, arity) \
+ virtual R operator()(BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, defaults_n), \
+ BOOST_LOCAL_arg_type, ~)) = 0;
+
+#define BOOST_LOCAL_template_name(defaults_count) \
+ BOOST_PP_CAT(BOOST_PP_CAT(functor_defaults, defaults_count), _base)
+
+namespace boost { namespace local { namespace aux {
+
+template<typename F, unsigned int defaults_count = 0> // Defaults count is opt.
+struct function_base {}; // Empty so never used directly.
+
+// Iteration within the namespace.
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (0, BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX, \
+ BOOST_LOCAL_AUX_FILE_FUNCTION_BASE_HPP))
+# include BOOST_PP_ITERATE() // Iterate over arity.
+
+}}} // namespace boost::local::aux
+
+# undef BOOST_LOCAL_arg_type
+# undef BOOST_LOCAL_arg_typename
+# undef BOOST_LOCAL_operator_call
+# undef BOOST_LOCAL_template_name
+
+# endif // #include guard
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+# define BOOST_LOCAL_arity BOOST_PP_FRAME_ITERATION(1)
+
+# define BOOST_PP_ITERATION_PARAMS_2 \
+ (3, (0, BOOST_LOCAL_arity, \
+ BOOST_LOCAL_AUX_FILE_FUNCTION_BASE_HPP))
+# include BOOST_PP_ITERATE() // Iterate over default params count.
+# undef BOOST_LOCAL_arity
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+# define BOOST_LOCAL_defaults_count BOOST_PP_FRAME_ITERATION(2)
+
+template<typename R
+ BOOST_PP_COMMA_IF(BOOST_LOCAL_arity)
+ BOOST_PP_ENUM(BOOST_LOCAL_arity,
+ BOOST_LOCAL_arg_typename, ~)>
+struct function_base<
+ R (BOOST_PP_ENUM(BOOST_LOCAL_arity,
+ BOOST_LOCAL_arg_type, ~)),
+ BOOST_LOCAL_defaults_count> {
+ /* PP_INC to also handle no defaults */ \
+ BOOST_PP_REPEAT(BOOST_PP_INC(BOOST_LOCAL_defaults_count),
+ BOOST_LOCAL_operator_call, BOOST_LOCAL_arity)
+};
+
+# undef BOOST_LOCAL_defaults_count
+
+#endif // iteration
+

Added: sandbox/local/boost/local/aux_/function/code_/binding.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/function/code_/binding.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,95 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_HPP_
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_HPP_
+
+#include "param.hpp"
+#include "../../symbol.hpp"
+#include "../../preprocessor/sign/params/all_bind_names.hpp"
+#include "../../preprocessor/sign/params/has_any_bind.hpp"
+#include "../../scope_exit/scope_exit.hpp" // Use Boost.ScopeExit internal impl.
+#include <boost/detail/preprocessor/sign/params.hpp>
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_iif.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// Adapted from `BOOST_SCOPE_EXIT_AUX_IMPL()`.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_WITH_TAGS_SEQ_( \
+ sign, all_bind_names, has_this, id, typename_keyword) \
+ /* binding tags */ \
+ BOOST_PP_EXPR_IIF(has_this, \
+ BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_TYPE_(id); \
+ ) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_TAG_DECL, \
+ id, all_bind_names) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL, \
+ (id, typename_keyword), all_bind_names) \
+ /* binding class */ \
+ struct BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) { \
+ BOOST_PP_EXPR_IIF(has_this, \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_TYPE_(id) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_NAME_; \
+ ) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_DECL, \
+ (id, typename_keyword), all_bind_names) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER, \
+ id, all_bind_names) \
+ } BOOST_LOCAL_AUX_SYMBOL_PARAMS_LOCAL_VARIABLE_NAME(id) = { \
+ /* initialize the struct with param values to bind */ \
+ BOOST_PP_EXPR_IIF(has_this, this) \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITAND(has_this, BOOST_PP_NOT( \
+ BOOST_DETAIL_PP_NILSEQ_IS_NIL(all_bind_names)))) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I( \
+ BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, all_bind_names) \
+ };
+
+// Assume has some bind param.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_WITH_TAGS_( \
+ sign, params, id, typename_keyword) \
+ /* has some bind param then all bind names is never empty nil-seq */ \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_WITH_TAGS_SEQ_(sign, \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_THIS_NAME_REMOVE( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_NAMES( \
+ params)), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_ALL_BIND_THIS( \
+ params), \
+ id, typename_keyword)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_WITHOUT_TAGS_( \
+ sign, params, id, typename_keyword) \
+ struct BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) { \
+ /* empty struct */ \
+ } BOOST_LOCAL_AUX_SYMBOL_PARAMS_LOCAL_VARIABLE_NAME(id);
+
+// Public API.
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING( \
+ sign, id, typename_keyword) \
+ BOOST_PP_IIF(BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_ANY_BIND( \
+ BOOST_DETAIL_PP_SIGN_PARAMS(sign)), \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_WITH_TAGS_ \
+ , \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING_WITHOUT_TAGS_ \
+ )(sign, BOOST_DETAIL_PP_SIGN_PARAMS(sign), id, typename_keyword) \
+ /* this `declared<>` must be present also when no bind param specified */ \
+ boost::scope_exit::aux::declared< boost::scope_exit::aux::resolve< \
+ /* cannot prefix with `::` as in `sizeof(:: ...` because the name */ \
+ /* must refer to the local variable name to allow multiple local */ \
+ /* functions (and exits) within the same scope (however this */ \
+ /* does not allow for nesting because local variables cannot be */ \
+ /* used in nested code blocks) */ \
+ sizeof(BOOST_LOCAL_AUX_SYMBOL_ARGS_VARIABLE_NAME) \
+ >::cmp1<0>::cmp2 > BOOST_LOCAL_AUX_SYMBOL_ARGS_VARIABLE_NAME; \
+ BOOST_LOCAL_AUX_SYMBOL_ARGS_VARIABLE_NAME.value = \
+ &BOOST_LOCAL_AUX_SYMBOL_PARAMS_LOCAL_VARIABLE_NAME(id);
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/function/code_/functor.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/function/code_/functor.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,286 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_HPP_
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_HPP_
+
+#include "param.hpp"
+#include "../base.hpp"
+#include "../../symbol.hpp"
+#include "../../preprocessor/sign/params/unbind.hpp"
+#include "../../preprocessor/sign/params/const_bind_names.hpp"
+#include "../../preprocessor/sign/params/bind_names.hpp"
+#include "../../preprocessor/sign/params/has_unbind.hpp"
+#include "../../preprocessor/sign/params/has_const_bind.hpp"
+#include "../../preprocessor/sign/params/has_bind.hpp"
+#include "../../preprocessor/sign/params/has_any_bind.hpp"
+#include "../../preprocessor/sign/params/this.hpp"
+#include "../../scope_exit/scope_exit.hpp" // Use Boost.ScopeExit internal impl.
+#include "../../../config.hpp"
+#include "../../../function_ref.hpp"
+#include <boost/detail/preprocessor/sign/name.hpp>
+#include <boost/detail/preprocessor/sign/result_type.hpp>
+#include <boost/detail/preprocessor/sign/inline.hpp>
+#include <boost/detail/preprocessor/sign/params/fold_left.hpp>
+#include <boost/detail/preprocessor/sign/params/enum.hpp>
+#include <boost/detail/preprocessor/sign/params/first_n.hpp>
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/logical/bitand.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/logical/bitor.hpp>
+#include <boost/preprocessor/logical/or.hpp>
+#include <boost/preprocessor/arithmetic/inc.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/type_traits.hpp>
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_DEFAULTS_COUNT_OP_( \
+ s, defaults_count, param) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARAM_HAS_DEFAULT(param), \
+ BOOST_PP_INC(defaults_count) \
+ , \
+ defaults_count \
+ )
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_DEFAULTS_COUNT_( \
+ params) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FOLD_LEFT( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_DEFAULTS_COUNT_OP_, \
+ 0 /* start with defaults_count to 0 */, params)
+
+// Expand to the function type `R (A1, ...)`.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_F_(sign) \
+ BOOST_DETAIL_PP_SIGN_RESULT_TYPE(sign) \
+ ( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_ENUM( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_TYPE, ~, \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND( \
+ BOOST_DETAIL_PP_SIGN_PARAMS(sign))) \
+ )
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_CALL_( \
+ z, \
+ sign, \
+ unbind_params, \
+ const_bind_names, has_const_bind_this, \
+ bind_names, has_bind_this, \
+ id) \
+ BOOST_DETAIL_PP_SIGN_INLINE(sign) \
+ BOOST_DETAIL_PP_SIGN_RESULT_TYPE(sign) operator()( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_Z(z, \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_DECL, \
+ ~, unbind_params) \
+ ) { \
+ /* just forward call to member function with local func name */ \
+ return BOOST_LOCAL_AUX_SYMBOL_BODY_FUNCTION_NAME( \
+ /* this local functor reference (for recursion) */ \
+ *this \
+ /* pass const binds */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_NOT( \
+ BOOST_DETAIL_PP_NILSEQ_IS_NIL(const_bind_names))) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND, \
+ (id, 0 /* no offset */), \
+ const_bind_names) \
+ /* pass plain binds */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_NOT( \
+ BOOST_DETAIL_PP_NILSEQ_IS_NIL(bind_names))) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND, \
+ (id \
+ /* offset param index of # of preceeding */ \
+ /* const-bind params (could be 0)*/ \
+ , BOOST_DETAIL_PP_NILSEQ_SIZE(const_bind_names) \
+ ), \
+ bind_names) \
+ /* pass bind `this` */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITOR( \
+ has_const_bind_this, has_bind_this)) \
+ BOOST_PP_EXPR_IIF( \
+ BOOST_PP_BITOR(has_const_bind_this, has_bind_this), \
+ BOOST_LOCAL_AUX_SYMBOL_PARAMS_VARIABLE_NAME-> \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_NAME_ \
+ ) \
+ /* pass unbind params */ \
+ BOOST_PP_COMMA_IF(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE( \
+ unbind_params)) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_ENUM_Z(z, \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_NAME, \
+ ~, unbind_params) \
+ ); \
+ }
+
+// Return unbind params but without last (default) params specified by count.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_CALL_UNBIND_WITHOUT_DEFAULT_( \
+ defaults_count, unbind_params) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FIRST_N( \
+ BOOST_PP_SUB(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE( \
+ unbind_params), defaults_count), \
+ unbind_params)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_CALL_DEFAULTS_( \
+ z, n, sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_CALL_(z \
+ , BOOST_PP_TUPLE_ELEM(7, 0, \
+ sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ , BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_CALL_UNBIND_WITHOUT_DEFAULT_( \
+ n \
+ , BOOST_PP_TUPLE_ELEM(7, 1, \
+ sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ ) \
+ , BOOST_PP_TUPLE_ELEM(7, 2, \
+ sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ , BOOST_PP_TUPLE_ELEM(7, 3, \
+ sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ , BOOST_PP_TUPLE_ELEM(7, 4, \
+ sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ , BOOST_PP_TUPLE_ELEM(7, 5, \
+ sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ , BOOST_PP_TUPLE_ELEM(7, 6, \
+ sign_unbind_constbind_hasconstthis_bind_hasthis_id) \
+ )
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_HAS_ANY_BIND_( \
+ const_bind_names, has_const_bind_this, bind_names, has_bind_this) \
+ BOOST_PP_BITOR( \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL(const_bind_names)) \
+ , BOOST_PP_BITOR( \
+ BOOST_PP_NOT(BOOST_DETAIL_PP_NILSEQ_IS_NIL(bind_names)) \
+ , BOOST_PP_BITOR( \
+ has_const_bind_this \
+ , has_bind_this \
+ ) \
+ ) \
+ )
+
+// Adapted from `BOOST_SCOPE_EXIT_AUX_IMPL()`.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_( \
+ sign, \
+ unbind_params, defaults_count, \
+ const_bind_names, has_const_bind_this, \
+ bind_names, has_bind_this, \
+ id, typename_keyword) \
+ /* typedef outside struct so END doesn't need typename (no END_TPL) */ \
+ typedef ::boost::local::function_ref< \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_F_(sign) \
+ , defaults_count \
+ > BOOST_LOCAL_AUX_SYMBOL_FUNCTION_REF_NAME( \
+ BOOST_DETAIL_PP_SIGN_NAME(sign)); \
+ struct BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_CLASS_NAME( \
+ BOOST_DETAIL_PP_SIGN_NAME(sign)) \
+ : ::boost::local::aux::function_base< \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_F_(sign), \
+ defaults_count> \
+ { \
+ /* constructor */ \
+ explicit BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_CLASS_NAME( \
+ BOOST_DETAIL_PP_SIGN_NAME(sign))(void* bind_params) \
+ BOOST_PP_EXPR_IIF( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_HAS_ANY_BIND_( \
+ const_bind_names, has_const_bind_this, \
+ bind_names, has_bind_this), \
+ : BOOST_LOCAL_AUX_SYMBOL_PARAMS_VARIABLE_NAME( \
+ (BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)*) /*type-cast*/ \
+ bind_params) \
+ ) \
+ {} \
+ /* implement base functor `operator()` (and for all default params) */ \
+ BOOST_PP_REPEAT(BOOST_PP_INC( /* PP_INC to handle also no defaults */ \
+ defaults_count), \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_CALL_DEFAULTS_,\
+ (sign, unbind_params, const_bind_names, has_const_bind_this, \
+ bind_names, has_bind_this, id) \
+ ) \
+ private: \
+ /* bind params member variable (note -- signle bind param cannot */ \
+ /* be represented as single member variables because their names */ \
+ /* might be prefixed by `&` so they are not know to pp) */ \
+ BOOST_PP_EXPR_IIF( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_HAS_ANY_BIND_( \
+ const_bind_names, has_const_bind_this, \
+ bind_names, has_bind_this), \
+ BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)* \
+ BOOST_LOCAL_AUX_SYMBOL_PARAMS_VARIABLE_NAME; \
+ ) \
+ BOOST_DETAIL_PP_SIGN_INLINE(sign) \
+ static /* static so `this` cannot be mistaken for `this_` */ \
+ BOOST_DETAIL_PP_SIGN_RESULT_TYPE(sign) \
+ BOOST_LOCAL_AUX_SYMBOL_BODY_FUNCTION_NAME( \
+ /* a ref to this local functor for recursion */ \
+ BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_CLASS_NAME( \
+ BOOST_DETAIL_PP_SIGN_NAME(sign))& \
+ BOOST_DETAIL_PP_SIGN_NAME(sign) \
+ /* const binds */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_NOT( \
+ BOOST_DETAIL_PP_NILSEQ_IS_NIL(const_bind_names))) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_CONST_BIND_DECL, \
+ (id, typename_keyword, 0 /* no offset */), \
+ const_bind_names) \
+ /* plain binds */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_NOT( \
+ BOOST_DETAIL_PP_NILSEQ_IS_NIL(bind_names))) \
+ BOOST_DETAIL_PP_NILSEQ_FOR_EACH_I( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_BIND_DECL, \
+ (id, typename_keyword \
+ /* offset param index of # of preceeding */ \
+ /* const-bindparams (could be 0)*/ \
+ , BOOST_DETAIL_PP_NILSEQ_SIZE(const_bind_names) \
+ ), \
+ bind_names) \
+ /* `this` bind */ \
+ BOOST_PP_COMMA_IF(BOOST_PP_BITOR( \
+ has_const_bind_this, has_bind_this)) \
+ BOOST_PP_EXPR_IIF(has_const_bind_this, \
+ typename_keyword ::contract::detail::add_pointed_const< \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_TYPE_(id) \
+ >::type \
+ BOOST_LOCAL_CONFIG_THIS_PARAM_NAME \
+ ) \
+ BOOST_PP_EXPR_IIF(has_bind_this, \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_TYPE_( \
+ id) \
+ BOOST_LOCAL_CONFIG_THIS_PARAM_NAME \
+ ) \
+ /* unbind params (last because they can have defaults) */ \
+ BOOST_PP_COMMA_IF(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE( \
+ unbind_params)) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_ENUM( \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_DECL_WITH_DEFAULT, \
+ ~, unbind_params) \
+ ) /* end body function params */ \
+ /* user local function definition `{ ... }` will follow here */ \
+ /* `END()` macro will close function class decl `};` here */
+
+// Public API.
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR( \
+ sign, params, id, typename_keyword) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_( \
+ sign, \
+ /* unbind params (may have defaults) */ \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND(params), \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR_DEFAULTS_COUNT_( \
+ params), \
+ /* const bind param names (may have `this`) */ \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_THIS_NAME_REMOVE( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES( \
+ params)), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_THIS( \
+ params), \
+ /* (non-const) bind param names (may have `this`) */ \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_THIS_NAME_REMOVE( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_NAMES( \
+ params)), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND_THIS(params), \
+ id, typename_keyword)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/function/code_/param.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/function/code_/param.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,136 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_HPP_
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_HPP_
+
+#include "../../symbol.hpp"
+#include "../../scope_exit/scope_exit.hpp" // Use Boost.ScopeExit internal impl.
+#include <boost/detail/preprocessor/keyword/is_this.hpp>
+#include <boost/detail/preprocessor/sign/param/classifier.hpp>
+#include <boost/detail/preprocessor/sign/param/type.hpp>
+#include <boost/detail/preprocessor/sign/param/name.hpp>
+#include <boost/detail/preprocessor/sign/param/default.hpp>
+#include <boost/detail/type_traits/add_pointed_const.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+// Param named `this`.
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_TYPE_(id) \
+ BOOST_PP_CAT(se_this_type, id)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_THIS_NAME_ \
+ se_this
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_RENAME_THIS_( \
+ param_name) \
+ /* can't use `PP_KEYWORD_IS_THIS()` because some `param_name` might */ \
+ /* prefixed by `&` symbol (which can't be `PP_CAT()`) */ \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_KEYWORD_IS_TRAILING_THIS( \
+ param_name), \
+ BOOST_LOCAL_AUX_SYMBOL_THIS_PARAM_NAME \
+ , \
+ param_name \
+ )
+
+// Tag param.
+
+// Adapted from `BOOST_SCOPE_EXIT_AUX_TAG_DECL()`.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_TAG_DECL(r, id, i, var) \
+ typedef void (*BOOST_SCOPE_EXIT_AUX_TAG(id,i))(int \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_RENAME_THIS_(var) );
+
+// Bound param (const and non-const).
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND_TYPE( \
+ id_typename_offset, i, var) \
+ BOOST_SCOPE_EXIT_AUX_PARAMS_T( \
+ BOOST_PP_TUPLE_ELEM(3, 0, id_typename_offset)):: \
+ BOOST_SCOPE_EXIT_AUX_PARAM_T( \
+ BOOST_PP_TUPLE_ELEM(3, 0, id_typename_offset), \
+ BOOST_PP_ADD(i, BOOST_PP_TUPLE_ELEM(3, 2, id_typename_offset)),\
+ var)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND_VALUE( \
+ id_offset, i, var) \
+ BOOST_LOCAL_AUX_SYMBOL_PARAMS_VARIABLE_NAME-> \
+ BOOST_SCOPE_EXIT_AUX_PARAM( \
+ BOOST_PP_TUPLE_ELEM(2, 0, id_offset), \
+ BOOST_PP_ADD(i, BOOST_PP_TUPLE_ELEM(2, 1, id_offset)), \
+ var).value
+
+// Adapted from `BOOST_SCOPE_EXIT_AUX_ARG_DECL()`.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND_DECL_( \
+ r, id_typename_offset, i, var, const01) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_PP_TUPLE_ELEM(3, 1, id_typename_offset) /* eventual typename */ \
+ BOOST_PP_EXPR_IF(const01, \
+ BOOST_PP_IIF( \
+ BOOST_DETAIL_PP_KEYWORD_IS_TRAILING_THIS(var), \
+ ::contract::detail::add_pointed_const< /* pointed obj const */ \
+ , \
+ ::boost::add_const< /* outer type const */ \
+ ) \
+ BOOST_PP_TUPLE_ELEM(3, 1, id_typename_offset) /* eventual typename */ \
+ ) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND_TYPE( \
+ id_typename_offset, i, var) \
+ BOOST_PP_EXPR_IF(const01, >::type) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_RENAME_THIS_(var)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_CONST_BIND_DECL( \
+ r, id_typename_offset, i, var) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND_DECL_( \
+ r, id_typename_offset, i, var, 1 /* force const */)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_BIND_DECL( \
+ r, id_typename_offset, i, var) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND_DECL_( \
+ r, id_typename_offset, i, var, 0 /* do not force const */)
+
+// Adapted from `BOOST_SCOPE_EXIT_AUX_ARG()`.
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND( \
+ r, id_offset, i, var) \
+ BOOST_PP_COMMA_IF(i) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_MAYBECONST_BIND_VALUE( \
+ id_offset, i, var)
+
+// Unbind param.
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_DECL( \
+ z, param, unused) \
+ BOOST_DETAIL_PP_SIGN_PARAM_CLASSIFIER(param) /* opt auto/register */ \
+ BOOST_DETAIL_PP_SIGN_PARAM_TYPE(param) \
+ BOOST_DETAIL_PP_SIGN_PARAM_NAME(param)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_DECL_WITH_DEFAULT( \
+ z, param, unused) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_DECL( \
+ z, param, unused) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_SIGN_PARAM_HAS_DEFAULT(param), \
+ = BOOST_DETAIL_PP_SIGN_PARAM_DEFAULT \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(param)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_NAME( \
+ z, param, unused) \
+ BOOST_DETAIL_PP_SIGN_PARAM_NAME(param)
+
+#define BOOST_LOCAL_AUX_FUNCTION_CODE_PARAM_UNBIND_TYPE( \
+ z, param, unused) \
+ BOOST_DETAIL_PP_SIGN_PARAM_TYPE(param)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/function/decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/function/decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,61 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_FUNCTION_DECL_HPP_
+#define BOOST_LOCAL_AUX_FUNCTION_DECL_HPP_
+
+#include "code_/binding.hpp"
+#include "code_/functor.hpp"
+#include "../symbol.hpp"
+#include "../preprocessor/sign/parse_decl.hpp"
+#include <boost/detail/preprocessor/sign/params.hpp>
+#include <boost/detail/preprocessor/sign/parser/apply.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/scope_exit.hpp> // Use Boost.ScopeExit internal implementation.
+
+// Undefine local function bound args global variable. Actual declaration of
+// this variable is made using SFINAE mechanisms by each local function macro.
+extern boost::scope_exit::aux::undeclared
+ BOOST_LOCAL_AUX_SYMBOL_ARGS_VARIABLE_NAME;
+
+#define BOOST_LOCAL_AUX_FUNCTION_DECL_( \
+ sign, params, id, typename_keyword) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_BINDING( \
+ sign, id, typename_keyword) \
+ BOOST_LOCAL_AUX_FUNCTION_CODE_FUNCTOR( \
+ sign, params, id, typename_keyword)
+
+#define BOOST_LOCAL_AUX_FUNCTION_DECL_OK_(sign, typename_keyword) \
+ BOOST_LOCAL_AUX_FUNCTION_DECL_(sign, \
+ BOOST_DETAIL_PP_SIGN_PARAMS(sign), \
+ /* use `name ## __LINE__` so functions can appear on same line */ \
+ BOOST_PP_CAT(BOOST_DETAIL_PP_SIGN_NAME(sign), __LINE__), \
+ typename_keyword)
+
+#define BOOST_LOCAL_AUX_FUNCTION_DECL_ERR_(message, unused) \
+ ; /* close eventaul previous staments, otherwise no effect */ \
+ BOOST_MPL_ASSERT_MSG(false /* assertion always fails */, message, ()) \
+ ; /* must close ASSERT macro for eventual use within class scope */
+
+// Public API.
+
+// Must be followed by function body definition and closing class brakets
+// `{ ... } LOCAL_FUNCTION_END ` (so to avoid wrapping function body code
+// within macro param and retain original compiler error line numbers for
+// body code).
+#define BOOST_LOCAL_AUX_FUNCTION_DECL( \
+ parenthesized_syntax_seq, typename_keyword) \
+ BOOST_DETAIL_PP_SIGN_PARSER_APPLY( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARSE_DECL( \
+ parenthesized_syntax_seq), \
+ BOOST_LOCAL_AUX_FUNCTION_DECL_OK_, \
+ BOOST_LOCAL_AUX_FUNCTION_DECL_ERR_, \
+ typename_keyword)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/function/end.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/function/end.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,51 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_FUNCTION_END_HPP_
+#define BOOST_LOCAL_AUX_FUNCTION_END_HPP_
+
+#include "../symbol.hpp"
+
+// Public API.
+
+// Must follow user local function definition code block `{ ... } END()`.
+#define BOOST_LOCAL_AUX_FUNCTION_END(local_function_name) \
+ }; /* closes functor class declaration */ \
+ /* declares functor local variable to call the local function -- note: */ \
+ /* terminates class decl with `;` above and repeate class name here so */ \
+ /* to generate compile-time error in case `local_function_name` does */ \
+ /* not match the one specified in the local function declaration seq */ \
+ /* (because class name will be different) */ \
+ BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_CLASS_NAME(local_function_name) \
+ /* declares functor object */ \
+ BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_OBJECT_NAME(local_function_name)( \
+ BOOST_LOCAL_AUX_SYMBOL_ARGS_VARIABLE_NAME.value); \
+ /* wraps functor ref into global functor type to pass it as tparam */ \
+ BOOST_LOCAL_AUX_SYMBOL_FUNCTION_REF_NAME(local_function_name) \
+ local_function_name( \
+ BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_OBJECT_NAME( \
+ local_function_name));
+
+// Must follow user local function definition code block `{ ... } END()`.
+// This allows to rename the local function after its definition -- this can
+// be usefull when local functions are automatically generated by macros which
+// cannot ensure same name is used by both the declaration macro and the end
+// macro (like for scope exit).
+// LIMITATION: Renamed local function cannot be passed as tparams (this is
+// because `CLASS_NAME()` macro cannot be used when renaming so the global
+// functor class type cannot be determined by the `END_RENAME()` macro).
+#define BOOST_LOCAL_AUX_FUNCTION_END_RENAME(new_local_function_name) \
+ } /* closes functor class declaration */ \
+ /* declares functor local variable to call the local function -- note: */ \
+ /* the functor type is not repeated so the functor object can have a */ \
+ /* name that does not match the one specified in the local function */ \
+ /* declaration */ \
+ new_local_function_name( \
+ BOOST_LOCAL_AUX_SYMBOL_ARGS_VARIABLE_NAME.value); \
+
+#endif // #include buard
+

Added: sandbox/local/boost/local/aux_/function_ref.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/function_ref.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,116 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+// IMPORTANT: Even if this file is in the "aux_" directory, its macro names
+// must NOT be prefixed by "AUX" or be within the "aux" namespace. This is
+// because this file is an helper to automatically implement all `function_ref`
+// template specializations which must leave outside the "aux" namespace.
+
+#if !BOOST_PP_IS_ITERATING
+# ifndef BOOST_LOCAL_AUX_FUNCTION_REF_HPP_
+# define BOOST_LOCAL_AUX_FUNCTION_REF_HPP_
+
+# include "function/base.hpp"
+# include "file.hpp"
+# include "../config.hpp"
+# include <boost/preprocessor/iteration/iterate.hpp>
+# include <boost/preprocessor/repetition/repeat.hpp>
+# include <boost/preprocessor/repetition/enum.hpp>
+# include <boost/preprocessor/punctuation/comma_if.hpp>
+# include <boost/preprocessor/arithmetic/sub.hpp>
+# include <boost/preprocessor/arithmetic/inc.hpp>
+# include <boost/preprocessor/cat.hpp>
+
+#define BOOST_LOCAL_arg_type(z, arg_n, unused) \
+ BOOST_PP_CAT(A, arg_n)
+
+#define BOOST_LOCAL_arg_name(z, arg_n, unused) \
+ BOOST_PP_CAT(a, arg_n)
+
+#define BOOST_LOCAL_arg(z, arg_n, unused) \
+ BOOST_LOCAL_arg_type(z, arg_n, unused) \
+ BOOST_LOCAL_arg_name(z, arg_n, unused)
+
+#define BOOST_LOCAL_arg_typename(z, arg_n, unused) \
+ typename BOOST_LOCAL_arg_type(z, arg_n, unused)
+
+#define BOOST_LOCAL_operator_call(z, defaults_n, arity) \
+ inline R operator()(BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, defaults_n), \
+ BOOST_LOCAL_arg, ~)) { \
+ return ref_(BOOST_PP_ENUM_ ## z(BOOST_PP_SUB(arity, defaults_n), \
+ BOOST_LOCAL_arg_name, ~)); \
+ }
+
+// Iteration within the namespace.
+# define BOOST_PP_ITERATION_PARAMS_1 \
+ (3, (0, BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX, \
+ BOOST_LOCAL_AUX_FILE_FUNCTION_REF_HPP))
+# include BOOST_PP_ITERATE() // Iterate over arity.
+
+# undef BOOST_LOCAL_arg_type
+# undef BOOST_LOCAL_arg_name
+# undef BOOST_LOCAL_arg
+# undef BOOST_LOCAL_arg_typename
+# undef BOOST_LOCAL_operator_call
+
+# endif // #include guard
+
+#elif BOOST_PP_ITERATION_DEPTH() == 1
+# define BOOST_LOCAL_arity BOOST_PP_FRAME_ITERATION(1)
+
+# define BOOST_PP_ITERATION_PARAMS_2 \
+ (3, (0, BOOST_LOCAL_arity, \
+ BOOST_LOCAL_AUX_FILE_FUNCTION_REF_HPP))
+# include BOOST_PP_ITERATE() // Iterate over default params count.
+# undef BOOST_LOCAL_arity
+
+#elif BOOST_PP_ITERATION_DEPTH() == 2
+# define BOOST_LOCAL_defaults BOOST_PP_FRAME_ITERATION(2)
+
+namespace boost { namespace local {
+
+template<typename R
+ BOOST_PP_COMMA_IF(BOOST_LOCAL_arity)
+ BOOST_PP_ENUM(BOOST_LOCAL_arity,
+ BOOST_LOCAL_arg_typename, ~)>
+class function_ref<
+ R (BOOST_PP_ENUM(BOOST_LOCAL_arity,
+ BOOST_LOCAL_arg_type, ~)),
+ BOOST_LOCAL_defaults> {
+ typedef aux::function_base<
+ R (
+ BOOST_PP_ENUM(BOOST_LOCAL_arity,
+ BOOST_LOCAL_arg_type, ~)
+ )
+ , BOOST_LOCAL_defaults
+ > base;
+
+public:
+ /* implicit */ function_ref(base& ref): ref_(ref) {}
+
+ function_ref& operator=(base& ref) {
+ ref_ = ref;
+ return *this;
+ }
+
+ // Result operator(Arg1, ..., ArgN-1, ArgN) // iff defaults >= 0
+ // Result operator(Arg1, ..., ArgN-1) // iff defaults >= 1
+ // ... // etc
+ BOOST_PP_REPEAT( /* PP_INC to also handle no defaults */
+ BOOST_PP_INC(BOOST_LOCAL_defaults),
+ BOOST_LOCAL_operator_call, BOOST_LOCAL_arity)
+
+private:
+ base& ref_;
+};
+
+}} // namespace boost::local
+
+# undef BOOST_LOCAL_defaults
+
+#endif // iteration
+

Added: sandbox/local/boost/local/aux_/preprocessor/keyword/is_bind.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/keyword/is_bind.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,21 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_KEYWORD_IS_BIND_HPP_
+#define BOOST_LOCAL_AUX_PP_KEYWORD_IS_BIND_HPP_
+
+#include <boost/detail/preprocessor/keyword/check.hpp>
+
+// These are not local macros -- DO NOT #UNDEF.
+#define BOOST_LOCAL_AUX_PP_KEYWORD_BIND_bind (1)
+
+#define BOOST_LOCAL_AUX_PP_KEYWORD_IS_BIND(tokens) \
+ BOOST_DETAIL_PP_KEYWORD_CHECK_FRONT(tokens, \
+ BOOST_LOCAL_AUX_PP_KEYWORD_BIND_)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/keyword/is_const_bind.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/keyword/is_const_bind.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,42 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_HPP_
+#define BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_HPP_
+
+#include "is_bind.hpp"
+#include <boost/detail/preprocessor/keyword/is_const.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// IMPORTANT: This is not a local macro, do not #undef it.
+#define BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_STRIP_CONST_const \
+ /* must expand to nothing so to remove leading `const` */
+
+// Assumes there is a leading `const ...` and removes it.
+#define BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_STRIP_CONST_( \
+ tokens) \
+ BOOST_PP_CAT( \
+ BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_STRIP_CONST_, \
+ tokens)
+
+#define BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_(tokens) \
+ BOOST_LOCAL_AUX_PP_KEYWORD_IS_BIND( \
+ BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_STRIP_CONST_( \
+ tokens))
+
+#define BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND(tokens) \
+ BOOST_PP_IIF(BOOST_DETAIL_PP_KEYWORD_IS_CONST(tokens), \
+ BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND_ \
+ , \
+ 0 /* not `const`, so it cannot be `const binded` */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(tokens)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/all_bind_names.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/all_bind_names.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,38 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_NAMES_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_NAMES_HPP_
+
+#include "has_const_bind.hpp"
+#include "has_bind.hpp"
+#include "const_bind_names.hpp"
+#include "bind_names.hpp"
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_NAMES(params) \
+ (BOOST_PP_NIL) \
+ /* seq concat */ \
+ BOOST_PP_IIF(BOOST_PP_EXPAND( /* expand for MSVC */ \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND(params)), \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES(params)) \
+ /* seq concat */ \
+ BOOST_PP_IIF(BOOST_PP_EXPAND( /* expand for MSVC */ \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND(params)), \
+ BOOST_DETAIL_PP_NILSEQ_TO_SEQ \
+ , \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_NAMES(params))
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/bind_names.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/bind_names.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,35 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_NAMES_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_NAMES_HPP_
+
+#include "has_bind.hpp"
+#include <boost/detail/preprocessor/sign/params/size.hpp>
+#include <boost/detail/preprocessor/sign/param.hpp>
+#include <boost/detail/preprocessor/sign/param/name.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+
+// Has `bind` so params size >= 1 and `bind` is last param.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_GET_LAST_(params) \
+ (BOOST_PP_NIL) /* seq concat */ \
+ BOOST_DETAIL_PP_SIGN_PARAM_NAME(BOOST_DETAIL_PP_SIGN_PARAM( \
+ BOOST_PP_DEC(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params)), params))
+
+// Return bind names as nil-seq.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_NAMES(params) \
+ BOOST_PP_IIF(BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND(params), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_GET_LAST_ \
+ , \
+ (BOOST_PP_NIL) /* no bind param name */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/const_bind_names.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/const_bind_names.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,55 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES_HPP_
+
+#include "has_const_bind.hpp"
+#include "has_bind.hpp"
+#include <boost/detail/preprocessor/sign/params/size.hpp>
+#include <boost/detail/preprocessor/sign/param.hpp>
+#include <boost/detail/preprocessor/sign/param/name.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+
+// Has both `const bind` and `bind` so params size >= 2 and `const bind` is
+// 2nd last param.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_GET_2ND_LAST_( \
+ params) \
+ (BOOST_PP_NIL) /* seq concat (to expand to nil-seq) */ \
+ BOOST_DETAIL_PP_SIGN_PARAM_NAME(BOOST_DETAIL_PP_SIGN_PARAM( \
+ BOOST_PP_DEC(BOOST_PP_DEC(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE( \
+ params))), params))
+
+// Has `const bind` but not `bind` so params size >= 1 and `const bind` is
+// last param.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_GET_LAST_(params) \
+ (BOOST_PP_NIL) /* seq concat (to expand to nil-seq) */ \
+ BOOST_DETAIL_PP_SIGN_PARAM_NAME(BOOST_DETAIL_PP_SIGN_PARAM( \
+ BOOST_PP_DEC(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params)), params))
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES_GET_(params) \
+ BOOST_PP_IIF(BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND(params), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_GET_2ND_LAST_ \
+ , \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_GET_LAST_ \
+ )(params)
+
+// Return bind names as nil-seq.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES(params) \
+ BOOST_PP_IIF(BOOST_PP_EXPAND( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND(params)), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES_GET_ \
+ , \
+ (BOOST_PP_NIL) /* no bind param name */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/has_any_bind.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/has_any_bind.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,22 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_ANY_BIND_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_ANY_BIND_HPP_
+
+#include "has_const_bind.hpp"
+#include "has_bind.hpp"
+#include <boost/preprocessor/logical/or.hpp>
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_ANY_BIND(params) \
+ BOOST_PP_OR( /* can't use `BITOR` for reentrancy on MSVC... */ \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND(params) \
+ , BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND(params) \
+ )
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/has_bind.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/has_bind.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,39 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND_HPP_
+
+#include "../../keyword/is_bind.hpp"
+#include <boost/detail/preprocessor/sign/params/size.hpp>
+#include <boost/detail/preprocessor/sign/param.hpp>
+#include <boost/detail/preprocessor/sign/param/type.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/control/if.hpp>
+
+// IMPORTANT: Do not delay macro expansion within these `PP_IF()` so avoid
+// expansion problems due to reentrancy with nested `PP_IF()` (because these
+// `HAS()` macros can be used within a `PP_IF()` as the condition statement).
+
+// Assume param size >= 1.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND_AT_LAST_(params) \
+ BOOST_LOCAL_AUX_PP_KEYWORD_IS_BIND( \
+ BOOST_DETAIL_PP_SIGN_PARAM_TYPE( \
+ BOOST_DETAIL_PP_SIGN_PARAM(BOOST_PP_DEC( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params)), params)))
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND(params) \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND_AT_LAST_ \
+ , \
+ 0 /* no params so no bind params */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/has_const_bind.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/has_const_bind.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,76 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_HPP_
+
+#include "../../keyword/is_bind.hpp"
+#include "../../keyword/is_const_bind.hpp"
+#include <boost/detail/preprocessor/sign/params/size.hpp>
+#include <boost/detail/preprocessor/sign/param.hpp>
+#include <boost/detail/preprocessor/sign/param/type.hpp>
+#include <boost/preprocessor/tuple/eat.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/comparison/greater.hpp>
+#include <boost/preprocessor/control/iif.hpp>
+#include <boost/preprocessor/control/if.hpp>
+
+// IMPORTANT: Do not delay macro expansion within these `PP_IF()` so avoid
+// expansion problems due to reentrancy with nested `PP_IF()` (because these
+// `HAS()` macros can be used within a `PP_IF()` as the condition statement).
+
+// Assume param size >= 2.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_AT_2NDLAST_( \
+ params) \
+ BOOST_PP_AND( \
+ /* last param must be `bind`... */ \
+ BOOST_LOCAL_AUX_PP_KEYWORD_IS_BIND( \
+ BOOST_DETAIL_PP_SIGN_PARAM_TYPE( \
+ BOOST_DETAIL_PP_SIGN_PARAM(BOOST_PP_DEC( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params)), params))) \
+ , \
+ /* ... and 2nd last param must be `const bind` */ \
+ BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND( \
+ BOOST_DETAIL_PP_SIGN_PARAM_TYPE( \
+ BOOST_DETAIL_PP_SIGN_PARAM(BOOST_PP_DEC(BOOST_PP_DEC( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params))), params))) \
+ )
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_2NDLAST_( \
+ params) \
+ BOOST_PP_IIF(BOOST_PP_GREATER(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE( \
+ params), 1), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_AT_2NDLAST_ \
+ , \
+ 0 /* no 2nd last param and last param was not `const bind` */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(params)
+
+// Assume param size >= 1.
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_AT_LAST_( \
+ params) \
+ BOOST_PP_IIF(BOOST_LOCAL_AUX_PP_KEYWORD_IS_CONST_BIND( \
+ BOOST_DETAIL_PP_SIGN_PARAM_TYPE(BOOST_DETAIL_PP_SIGN_PARAM( \
+ BOOST_PP_DEC(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params)), \
+ params))), \
+ 1 /* last param is `const bind` */ \
+ , \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_2NDLAST_( \
+ params) \
+ )
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND(params) \
+ BOOST_PP_IF(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_AT_LAST_ \
+ , \
+ 0 /* no params so no bind params */ \
+ BOOST_PP_TUPLE_EAT(1) \
+ )(params)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/has_unbind.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/has_unbind.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,20 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_UNBIND_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_UNBIND_HPP_
+
+#include "unbind.hpp"
+#include <boost/detail/preprocessor/sign/params/size.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_UNBIND(params) \
+ BOOST_PP_BOOL(BOOST_DETAIL_PP_SIGN_PARAMS_SIZE( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND(params)))
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/this.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/this.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,73 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_THIS_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_THIS_HPP_
+
+#include <boost/detail/preprocessor/keyword/is_this.hpp>
+#include <boost/detail/preprocessor/nilseq.hpp>
+#include <boost/preprocessor/logical/bool.hpp>
+#include <boost/preprocessor/seq/remove.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_THIS_FIND_( \
+ params) \
+ BOOST_DETAIL_PP_NILSEQ_FIND( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_NAMES( \
+ params), \
+ BOOST_DETAIL_PP_KEYWORD_IS_TRAILING_THIS)
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_REMOVE_THIS_YES_( \
+ bind_names_nilseq, this_index) \
+ BOOST_PP_SEQ_REMOVE(bind_names_nilseq, this_index)
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_REMOVE_THIS_NO_( \
+ bind_names_nilseq, this_index) \
+ bind_names_nilseq
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_REMOVE_THIS_( \
+ bind_names_nilseq, this_index) \
+ BOOST_PP_IF(this_index, \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_REMOVE_THIS_YES_ \
+ , \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_REMOVE_THIS_NO_ \
+ )(bind_names_nilseq, this_index)
+
+// Public API.
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND_THIS(params) \
+ BOOST_PP_BOOL(BOOST_DETAIL_PP_NILSEQ_FIND( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_CONST_BIND_NAMES( \
+ params), \
+ BOOST_DETAIL_PP_KEYWORD_IS_TRAILING_THIS))
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND_THIS(params) \
+ BOOST_PP_BOOL(BOOST_DETAIL_PP_NILSEQ_FIND( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_BIND_NAMES(params), \
+ BOOST_DETAIL_PP_KEYWORD_IS_TRAILING_THIS))
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_ALL_BIND_THIS(params) \
+ BOOST_PP_BOOL( \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_THIS_FIND_( \
+ params))
+
+// Expand this macro iff `HAS_ALL_BIND_THIS()` is true (otherwise pp-error).
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_THIS_SEQ_INDEX( \
+ params) \
+ BOOST_PP_DEC( /* decrement to skip leading `PP_NIL` of nil-seq */ \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_ALL_BIND_THIS_FIND_( \
+ params))
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_THIS_NAME_REMOVE( \
+ bind_names_nilseq) \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_REMOVE_THIS_( \
+ bind_names_nilseq, \
+ BOOST_DETAIL_PP_NILSEQ_FIND(bind_names_nilseq, \
+ BOOST_DETAIL_PP_KEYWORD_IS_TRAILING_THIS))
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/params/unbind.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/params/unbind.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,54 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_HPP_
+
+#include "has_const_bind.hpp"
+#include "has_bind.hpp"
+#include <boost/detail/preprocessor/sign/params/size.hpp>
+#include <boost/detail/preprocessor/sign/params/first_n.hpp>
+#include <boost/preprocessor/array/elem.hpp>
+#include <boost/preprocessor/seq/first_n.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/arithmetic/sub.hpp>
+#include <boost/preprocessor/control/if.hpp>
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_STRIP_BINDS_( \
+ params, count_binds) \
+ BOOST_DETAIL_PP_SIGN_PARAMS_FIRST_N(BOOST_PP_SUB( \
+ BOOST_DETAIL_PP_SIGN_PARAMS_SIZE(params), count_binds), params)
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_STRIP_NOTHING_( \
+ params, count_binds) \
+ params /* strip nothing because there in no bind param */
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_( \
+ params, count_binds) \
+ BOOST_PP_IF(count_binds, \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_STRIP_BINDS_ \
+ , \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_STRIP_NOTHING_ \
+ )(params, count_binds)
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_COUNT_BINDS_(params) \
+ /* 2 if both `const bind` and `bind`; 1 if either `const bind` or */ \
+ /* `bind`; 0 if neihert `const bind` nor `bind` */ \
+ BOOST_PP_ADD(BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_CONST_BIND( \
+ params), BOOST_LOCAL_AUX_PP_SIGN_PARAMS_HAS_BIND( \
+ params))
+
+// Public API.
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND(params) \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_(params, \
+ BOOST_LOCAL_AUX_PP_SIGN_PARAMS_UNBIND_COUNT_BINDS_( \
+ params))
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/parse_decl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/parse_decl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,64 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_PARSE_DECL_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_PARSE_DECL_HPP_
+
+#include "validate_.hpp"
+#include <boost/detail/preprocessor/sign/parse/finish.hpp>
+#include <boost/detail/preprocessor/sign/parse/postcondition.hpp>
+#include <boost/detail/preprocessor/sign/parse/precondition.hpp>
+#include <boost/detail/preprocessor/sign/parse/initializers.hpp>
+#include <boost/detail/preprocessor/sign/parse/throw.hpp>
+#include <boost/detail/preprocessor/sign/parse/copyable.hpp>
+#include <boost/detail/preprocessor/sign/parse/volatile.hpp>
+#include <boost/detail/preprocessor/sign/parse/const.hpp>
+#include <boost/detail/preprocessor/sign/parse/params.hpp>
+#include <boost/detail/preprocessor/sign/parse/name.hpp>
+#include <boost/detail/preprocessor/sign/parse/result_type.hpp>
+#include <boost/detail/preprocessor/sign/parse/virtual.hpp>
+#include <boost/detail/preprocessor/sign/parse/static.hpp>
+#include <boost/detail/preprocessor/sign/parse/extern.hpp>
+#include <boost/detail/preprocessor/sign/parse/inline.hpp>
+#include <boost/detail/preprocessor/sign/parse/explicit.hpp>
+#include <boost/detail/preprocessor/sign/parse/requires.hpp>
+#include <boost/detail/preprocessor/sign/parse/template.hpp>
+#include <boost/detail/preprocessor/sign/parse/export.hpp>
+#include <boost/detail/preprocessor/sign/parse/access.hpp>
+#include <boost/detail/preprocessor/sign/parse/body.hpp>
+#include <boost/detail/preprocessor/sign/parse/start.hpp>
+
+#define BOOST_LOCAL_AUX_PP_SIGN_PARSE_DECL(parenthesized_syntax_seq) \
+ BOOST_LOCAL_AUX_PP_SIGN_VALIDATE( \
+ BOOST_DETAIL_PP_SIGN_PARSE_FINISH( \
+ BOOST_DETAIL_PP_SIGN_PARSE_POSTCONDITION_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_PRECONDITION_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INITIALIZERS_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_THROW_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_COPYABLE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VOLATILE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_CONST_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_PARAMS_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_NAME_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_RESULT_TYPE_REQ( \
+ BOOST_DETAIL_PP_SIGN_PARSE_VIRTUAL_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_STATIC_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXTERN_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_INLINE_OPT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPLICIT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_REQUIRES_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_TEMPLATE_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_EXPORT_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_ACCESS_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_BODY_BACK_NOT( \
+ BOOST_DETAIL_PP_SIGN_PARSE_START_NOEMPTY( \
+ parenthesized_syntax_seq, \
+ ERROR_missing_local_function_signature \
+ )))))))))))))))))))))))
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/preprocessor/sign/validate_.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/preprocessor/sign/validate_.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,27 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_PP_SIGN_VALIDATE_HPP_
+#define BOOST_LOCAL_AUX_PP_SIGN_VALIDATE_HPP_
+
+// FUTURE: Implement this macro to validate parsed local function signature:
+// no copyable params, no named params, name cannot be operator, etc.
+// VALIDATE: If there is a `const bound` param type then
+// 1) There must be only 1.
+// 2) It must be the last one or the 2nd last one if the last is `bound`.
+// 3) It must have no storage classifier or copyable.
+// 4) It must have no default.
+// VALIDATE: If there is a `bound` param type then
+// 1) There must be only 1.
+// 2) It must be the last one.
+// 3) It must have no storage classifier or compyable.
+// 4) It must have not default.
+#define BOOST_LOCAL_AUX_PP_SIGN_VALIDATE(seq_sign_err) \
+ seq_sign_err
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/aux_/scope_exit/scope_exit.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/scope_exit/scope_exit.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,423 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+//
+// 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)
+
+#ifndef FILE_boost_scope_exit_hpp_INCLUDED
+#define FILE_boost_scope_exit_hpp_INCLUDED
+
+#include <boost/config.hpp>
+
+#include <boost/detail/workaround.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/seq/cat.hpp>
+#include <boost/preprocessor/seq/for_each_i.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+#include <boost/preprocessor/facilities/identity.hpp>
+#include "typeof/typeof.hpp" // Local typeof with `this` MSVC workaround.
+
+#if defined(__GNUC__) && !defined(BOOST_INTEL)
+# define BOOST_SCOPE_EXIT_AUX_GCC (__GNUC__ * 100 + __GNUC_MINOR__)
+#else
+# define BOOST_SCOPE_EXIT_AUX_GCC 0
+#endif
+
+#if BOOST_WORKAROUND(BOOST_SCOPE_EXIT_AUX_GCC, BOOST_TESTED_AT(413))
+#define BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND
+#endif
+
+// Steven Watanabe's trick with a modification suggested by Kim Barrett
+namespace boost { namespace scope_exit { namespace aux {
+
+ // Type of a local boost_scope_exit_args variable.
+ // First use in a local scope will declare the boost_scope_exit_args
+ // variable, subsequent uses will be resolved as two comparisons
+ // (cmp1 with 0 and cmp2 with boost_scope_exit_args).
+ template<int Dummy = 0>
+ struct declared
+ {
+ void* value;
+ static int const cmp2 = 0;
+ friend void operator>(int, declared const&) {}
+ };
+
+ struct undeclared { declared<> dummy[2]; };
+
+ template<int> struct resolve;
+
+ template<>
+ struct resolve<sizeof(declared<>)>
+ {
+ static const int cmp1 = 0;
+ };
+
+ template<>
+ struct resolve<sizeof(undeclared)>
+ {
+ template<int>
+ struct cmp1
+ {
+ static int const cmp2 = 0;
+ };
+ };
+} } }
+
+extern boost::scope_exit::aux::undeclared boost_scope_exit_args; // undefined
+
+
+namespace boost { namespace scope_exit { namespace aux {
+
+typedef void (*ref_tag)(int&);
+typedef void (*val_tag)(int );
+
+template<class T, class Tag> struct member;
+
+template<class T>
+struct member<T,ref_tag>
+{
+ T& value;
+#ifndef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND
+ member(T& ref) : value(ref) {}
+#endif
+};
+
+template<class T>
+struct member<T,val_tag>
+{
+ T value;
+#ifndef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND
+ member(T& val) : value(val) {}
+#endif
+};
+
+template<class T> inline T& deref(T* p, ref_tag) { return *p; }
+template<class T> inline T& deref(T& r, val_tag) { return r; }
+
+template<class T>
+struct wrapper
+{
+ typedef T type;
+};
+
+template<class T> wrapper<T> wrap(T&);
+
+} } }
+
+#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
+BOOST_TYPEOF_REGISTER_TEMPLATE(boost::scope_exit::aux::wrapper, 1)
+
+#define BOOST_SCOPE_EXIT_AUX_GUARD(id) BOOST_PP_CAT(boost_se_guard_, id)
+#define BOOST_SCOPE_EXIT_AUX_GUARD_T(id) BOOST_PP_CAT(boost_se_guard_t_, id)
+#define BOOST_SCOPE_EXIT_AUX_PARAMS(id) BOOST_PP_CAT(boost_se_params_, id)
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) BOOST_PP_CAT(boost_se_params_t_, id)
+
+#define BOOST_SCOPE_EXIT_AUX_TAG(id, i) \
+ BOOST_PP_SEQ_CAT( (boost_se_tag_)(i)(_)(id) )
+
+#define BOOST_SCOPE_EXIT_AUX_PARAM(id, i, var) \
+ BOOST_PP_SEQ_CAT( (boost_se_param_)(i)(_)(id) )
+
+#define BOOST_SCOPE_EXIT_AUX_PARAM_T(id, i, var) \
+ BOOST_PP_SEQ_CAT( (boost_se_param_t_)(i)(_)(id) )
+
+#define BOOST_SCOPE_EXIT_AUX_CAPTURE_T(id, i, var) \
+ BOOST_PP_SEQ_CAT( (boost_se_capture_t_)(i)(_)(id) )
+
+#define BOOST_SCOPE_EXIT_AUX_WRAPPED(id, i) \
+ BOOST_PP_SEQ_CAT( (boost_se_wrapped_t_)(i)(_)(id) )
+
+#define BOOST_SCOPE_EXIT_AUX_DEREF(id, i, var) \
+ boost::scope_exit::aux::deref(var, (BOOST_SCOPE_EXIT_AUX_TAG(id,i))0)
+
+#define BOOST_SCOPE_EXIT_AUX_MEMBER(r, id, i, var) \
+ boost::scope_exit::aux::member< \
+ BOOST_SCOPE_EXIT_AUX_PARAM_T(id,i,var), \
+ BOOST_SCOPE_EXIT_AUX_TAG(id,i) \
+ > BOOST_SCOPE_EXIT_AUX_PARAM(id,i,var);
+
+// idty is (id,typename) or (id,BOOST_PP_EMPTY())
+#define BOOST_SCOPE_EXIT_AUX_ARG_DECL(r, idty, i, var) \
+ BOOST_PP_COMMA_IF(i) BOOST_PP_TUPLE_ELEM(2,1,idty) \
+ BOOST_SCOPE_EXIT_AUX_PARAMS_T(BOOST_PP_TUPLE_ELEM(2,0,idty)):: \
+ BOOST_SCOPE_EXIT_AUX_PARAM_T(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var) var
+
+#define BOOST_SCOPE_EXIT_AUX_ARG(r, id, i, var) BOOST_PP_COMMA_IF(i) \
+ boost_se_params_->BOOST_SCOPE_EXIT_AUX_PARAM(id,i,var).value
+
+#define BOOST_SCOPE_EXIT_AUX_TAG_DECL(r, id, i, var) \
+ typedef void (*BOOST_SCOPE_EXIT_AUX_TAG(id,i))(int var);
+
+
+//----begin-'this-capture'-detection-and-selection-mechanics----
+
+#if BOOST_WORKAROUND(BOOST_MSVC,>=1300)
+ // Boost.Typeof for VC71's typeid-based workaround does not work
+ // to determine the type of 'this' due to error C2355 being
+ // incorrectly reported (a compiler bug that's present in 8 and 9
+ // also). The typical avoidance strategy to evade this error is
+ // to make an indirect compile-time constant by assignment through
+ // enum, then use that as a type-index. This cannot happen with
+ // the typeid() approach, only with a sizeof() approach.
+ //
+ // The implementation below is the more general, type-index
+ // sizeof()-based approach implemented in Boost.Typeof which
+ // appears to work fine for typeof(this) provided the reference to
+ // 'this' is not present in the template argument list (i.e. the
+ // type-index is captured into a local enumerator before being
+ // used as a template argument).
+ //
+ // Inline documentation is removed and conditional compilation
+ // applied.
+ //
+ namespace boost { namespace scope_exit { namespace msvc_typeof_this
+ {
+ template<int ID>
+ struct msvc_typeid_wrapper {
+ typedef typename boost::type_of::msvc_extract_type<mpl::int_<ID> >::id2type id2type;
+ typedef typename id2type::type type;
+ };
+ template<>
+ struct msvc_typeid_wrapper<4> {
+ typedef msvc_typeid_wrapper<4> type;
+ };
+ template<typename T>
+ struct encode_type
+ {
+ BOOST_STATIC_CONSTANT(unsigned,value=BOOST_TYPEOF_INDEX(T));
+ typedef typename boost::type_of::msvc_register_type<T,mpl::int_<value> >::id2type type;
+ BOOST_STATIC_CONSTANT(unsigned,next=value+1);
+ BOOST_TYPEOF_NEXT_INDEX(next);
+ };
+ template<class T>
+ struct sizer
+ {
+ typedef char(*type)[encode_type<T>::value];
+ };
+ template<typename T> typename disable_if<
+ typename is_function<T>::type,
+ typename sizer<T>::type>::type encode_start(T const&);
+ template<typename T> typename enable_if<
+ typename is_function<T>::type,
+ typename sizer<T>::type>::type encode_start(T&);
+ template<typename Organizer, typename T>
+ boost::type_of::msvc_register_type<T,Organizer> typeof_register_type(const T&,Organizer* =0);
+
+ }}}
+
+# define BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() \
+ enum { BOOST_PP_CAT(boost_se_thistype_index_,__LINE__) = sizeof(*boost::scope_exit::msvc_typeof_this::encode_start(this)) }; \
+ typedef boost::scope_exit::msvc_typeof_this::msvc_typeid_wrapper<BOOST_PP_CAT(boost_se_thistype_index_,__LINE__)>::type
+
+#else // other Boost.Typeof 'this' appear to be okay
+# define BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() typedef BOOST_TYPEOF(this)
+#endif
+
+// 'this-capture' function-macros for when (*this) is requested
+//
+#define BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_this(seq) this BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq))
+#define BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_this(id,seq) BOOST_PP_CAT(se_this_type,id) se_this BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq))
+#define BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_this(seq) se_this(se_this) BOOST_PP_COMMA_IF(BOOST_PP_SEQ_SIZE(seq))
+#define BOOST_SCOPE_EXIT_THISINIT_BEGIN_PARAM_T_INITLIST_this(seq) :
+#define BOOST_SCOPE_EXIT_HASARGS_this(seq) 1
+
+#define BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_this(id) BOOST_SCOPE_EXIT_TYPEDEF_TYPEOF_THIS() BOOST_PP_CAT(se_this_type,id);
+#define BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_this(id) BOOST_PP_CAT(se_this_type,id) se_this;
+#define BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_this(id) \
+ inline BOOST_PP_CAT(se_this_type,id) operator->() { return boost_se_params_->se_this; } \
+ inline BOOST_PP_CAT(se_this_type,id) operator*() { return boost_se_params_->se_this; } \
+ inline operator BOOST_PP_CAT(se_this_type,id)() { return boost_se_params_->se_this; } \
+
+// 'this-capture' function-macros for when (*this) is not requested
+//
+#define BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_nothis(seq)
+#define BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_nothis(id,seq)
+#define BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_nothis(seq)
+#define BOOST_SCOPE_EXIT_THISINIT_BEGIN_PARAM_T_INITLIST_nothis(seq) BOOST_PP_IF(BOOST_PP_SEQ_SIZE(seq),BOOST_PP_IDENTITY(:),BOOST_PP_EMPTY)()
+#define BOOST_SCOPE_EXIT_HASARGS_nothis(seq) BOOST_PP_SEQ_SIZE(seq)
+
+#define BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_nothis(id)
+#define BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_nothis(id)
+#define BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_nothis(id)
+
+// Expand to 1 if the first sequence element is 'this'
+// or 0 otherwise.
+//
+// Mechanics: [given that 'this(x)' --> '(this(x))']
+//
+// head = front(seq) --> 'this' or 'somearg'
+// funcexp = head(_) --> '(this(_))' or 'somearg(_)'
+// size_and_possible_tokens = seq_size(funcexp)
+// yields either
+// 0 somearg(_)
+// or 1
+// expansion of 'cat(X,size_and_possible_tokens _) )'
+// yields either
+// X0 _ ) --> zero( _ ) --> 0
+// or X1 tokens _ ) --> one( tokens _ ) --> 1
+//
+// where X0 is BOOST_SCOPE_EXIT_HAS_THIS_CONSUME_0
+// X1 is BOOST_SCOPE_EXIT_HAS_THIS_CONSUME_1
+// zero() is BOOST_SCOPE_EXIT_HAS_THIS_FALSE()
+// one() is BOOST_SCOPE_EXIT_HAS_THIS_TRUE()
+//
+#define BOOST_SCOPE_EXIT_HAS_THIS(seq) \
+ BOOST_PP_CAT(BOOST_SCOPE_EXIT_HAS_THIS_CONSUME_, \
+ BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_HEAD(seq)(_)) _) ) \
+
+#define BOOST_SCOPE_EXIT_HAS_THIS_CONSUME_0 BOOST_SCOPE_EXIT_HAS_THIS_FALSE(
+#define BOOST_SCOPE_EXIT_HAS_THIS_CONSUME_1 BOOST_SCOPE_EXIT_HAS_THIS_TRUE(
+
+#define BOOST_SCOPE_EXIT_HAS_THIS_FALSE(x) 0
+#define BOOST_SCOPE_EXIT_HAS_THIS_TRUE(x) 1
+
+// Forwarding front-end to determine whether 'this' is the first
+// element of the sequence and adapt the invocation of the detail
+// accordingly. The dummy is passed to allow for an empty sequence.
+#define BOOST_SCOPE_EXIT_AUX_IMPL_FE(id, seq, ty) \
+ BOOST_SCOPE_EXIT_AUX_IMPL_FE2(id, seq, ty, BOOST_SCOPE_EXIT_HAS_THIS(seq (dummy))) \
+
+#define BOOST_SCOPE_EXIT_AUX_IMPL_FE2(id, seq, ty, has_this) \
+ BOOST_SCOPE_EXIT_AUX_IMPL(id, BOOST_PP_IF(has_this, BOOST_PP_SEQ_TAIL(seq),seq), \
+ ty, BOOST_PP_IF(has_this, this,nothis) ) \
+
+//----end-'this-capture'-detection-and-selection-mechanics----
+
+#ifdef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND
+
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this)
+
+#define BOOST_SCOPE_EXIT_AUX_PARAM_INIT(r, id, i, var) \
+ BOOST_PP_COMMA_IF(i) { BOOST_SCOPE_EXIT_AUX_DEREF(id,i,var) }
+
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this) \
+ = { BOOST_PP_CAT(BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_,this)(seq) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) };
+
+#else
+
+#define BOOST_SCOPE_EXIT_AUX_CTOR_ARG(r, id, i, var) BOOST_PP_COMMA_IF(i) \
+ BOOST_SCOPE_EXIT_AUX_PARAM_T(id,i,var) & BOOST_PP_CAT(a,i)
+
+#define BOOST_SCOPE_EXIT_AUX_MEMBER_INIT(r, id, i, var) BOOST_PP_COMMA_IF(i) \
+ BOOST_SCOPE_EXIT_AUX_PARAM(id,i,var) ( BOOST_PP_CAT(a,i) )
+
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this) \
+ BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)( \
+ BOOST_PP_CAT(BOOST_SCOPE_EXIT_THISPARAM_COMMA_IF_,this)(id,seq) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CTOR_ARG, id, seq ) ) \
+ BOOST_PP_CAT(BOOST_SCOPE_EXIT_THISINIT_BEGIN_PARAM_T_INITLIST_,this)(seq)\
+ BOOST_PP_CAT(BOOST_SCOPE_EXIT_THISINIT_COMMA_IF_,this)(seq) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER_INIT, id, seq) {}
+
+#define BOOST_SCOPE_EXIT_AUX_PARAM_INIT(r, id, i, var) \
+ BOOST_PP_COMMA_IF(i) BOOST_SCOPE_EXIT_AUX_DEREF(id,i,var)
+
+#define BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this) \
+ BOOST_PP_IF(BOOST_PP_CAT(BOOST_SCOPE_EXIT_HASARGS_,this)(seq), \
+ BOOST_PP_IDENTITY( \
+ ( BOOST_PP_CAT(BOOST_SCOPE_EXIT_REALTHIS_COMMA_IF_,this)(seq) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_INIT, id, seq) ) \
+ ),BOOST_PP_EMPTY)(); \
+
+#endif
+
+#if defined(BOOST_TYPEOF_EMULATION)
+
+#define BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL(r, idty, i, var) \
+ struct BOOST_SCOPE_EXIT_AUX_WRAPPED(BOOST_PP_TUPLE_ELEM(2,0,idty), i) \
+ : BOOST_TYPEOF(boost::scope_exit::aux::wrap( \
+ BOOST_SCOPE_EXIT_AUX_DEREF(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var))) \
+ {}; typedef BOOST_PP_TUPLE_ELEM(2,1,idty) \
+ BOOST_SCOPE_EXIT_AUX_WRAPPED(BOOST_PP_TUPLE_ELEM(2,0,idty), i)::type \
+ BOOST_SCOPE_EXIT_AUX_CAPTURE_T(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var);
+
+#elif defined(BOOST_INTEL)
+
+#define BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL(r, idty, i, var) \
+ typedef BOOST_TYPEOF_KEYWORD( \
+ BOOST_SCOPE_EXIT_AUX_DEREF(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var)) \
+ BOOST_SCOPE_EXIT_AUX_CAPTURE_T(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var);
+
+#else
+
+#define BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL(r, idty, i, var) \
+ typedef BOOST_TYPEOF(boost::scope_exit::aux::wrap( \
+ BOOST_SCOPE_EXIT_AUX_DEREF(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var))) \
+ BOOST_SCOPE_EXIT_AUX_WRAPPED(BOOST_PP_TUPLE_ELEM(2,0,idty), i); \
+ typedef BOOST_PP_TUPLE_ELEM(2,1,idty) \
+ BOOST_SCOPE_EXIT_AUX_WRAPPED(BOOST_PP_TUPLE_ELEM(2,0,idty), i)::type \
+ BOOST_SCOPE_EXIT_AUX_CAPTURE_T(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var);
+
+#endif
+
+#define BOOST_SCOPE_EXIT_AUX_PARAM_DECL(r, idty, i, var) \
+ typedef BOOST_SCOPE_EXIT_AUX_CAPTURE_T( \
+ BOOST_PP_TUPLE_ELEM(2,0,idty), i, var) \
+ BOOST_SCOPE_EXIT_AUX_PARAM_T(BOOST_PP_TUPLE_ELEM(2,0,idty), i, var);
+
+
+#define BOOST_SCOPE_EXIT_AUX_IMPL(id, seq, ty, this) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_TAG_DECL, id, seq) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_CAPTURE_DECL, (id,ty), seq) \
+ BOOST_PP_CAT(BOOST_SCOPE_EXIT_TYPEDEF_THISTYPE_,this)(id) \
+ struct BOOST_SCOPE_EXIT_AUX_PARAMS_T(id) { \
+ BOOST_PP_CAT(BOOST_SCOPE_EXIT_DEFINE_THISMEMBER_,this)(id) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_PARAM_DECL, (id,ty), seq) \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_MEMBER, id, seq) \
+ BOOST_SCOPE_EXIT_AUX_PARAMS_T_CTOR(id, seq, this) \
+ } BOOST_SCOPE_EXIT_AUX_PARAMS(id) BOOST_SCOPE_EXIT_AUX_PARAMS_INIT(id, seq, this)\
+ boost::scope_exit::aux::declared< boost::scope_exit::aux::resolve< \
+ sizeof(boost_scope_exit_args)>::cmp1<0>::cmp2 > boost_scope_exit_args; \
+ boost_scope_exit_args.value = &BOOST_SCOPE_EXIT_AUX_PARAMS(id); \
+ struct BOOST_SCOPE_EXIT_AUX_GUARD_T(id) { \
+ BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)* boost_se_params_; \
+ BOOST_SCOPE_EXIT_AUX_GUARD_T(id) (void* boost_se_params) \
+ : boost_se_params_( \
+ (BOOST_SCOPE_EXIT_AUX_PARAMS_T(id)*)boost_se_params) \
+ {} \
+ BOOST_PP_CAT(BOOST_SCOPE_EXIT_DEFINE_THIS_ACCESSOR_,this)(id) \
+ ~BOOST_SCOPE_EXIT_AUX_GUARD_T(id)() { boost_se_body( \
+ BOOST_PP_SEQ_FOR_EACH_I(BOOST_SCOPE_EXIT_AUX_ARG, id, seq) ); } \
+ void boost_se_body(BOOST_PP_SEQ_FOR_EACH_I( \
+ BOOST_SCOPE_EXIT_AUX_ARG_DECL, (id,ty), seq) )
+
+#if defined(BOOST_MSVC)
+
+#ifndef BOOST_SCOPE_EXIT_DONT_DISABLE_C4003
+#pragma warning(disable:4003)
+#endif
+
+#define BOOST_SCOPE_EXIT_END } BOOST_SCOPE_EXIT_AUX_GUARD(__COUNTER__) ( \
+ boost_scope_exit_args.value);
+
+#define BOOST_SCOPE_EXIT(seq) \
+ BOOST_SCOPE_EXIT_AUX_IMPL_FE(__COUNTER__, seq, BOOST_PP_EMPTY())
+
+#else
+
+#define BOOST_SCOPE_EXIT_END } BOOST_SCOPE_EXIT_AUX_GUARD(__LINE__) ( \
+ boost_scope_exit_args.value);
+
+#define BOOST_SCOPE_EXIT(seq) \
+ BOOST_SCOPE_EXIT_AUX_IMPL_FE(__LINE__, seq, BOOST_PP_EMPTY())
+
+#endif
+
+#ifdef BOOST_SCOPE_EXIT_AUX_TPL_WORKAROUND
+#define BOOST_SCOPE_EXIT_TPL(seq) \
+ BOOST_SCOPE_EXIT_AUX_IMPL_FE(__LINE__, seq, typename)
+#else
+#define BOOST_SCOPE_EXIT_TPL(seq) BOOST_SCOPE_EXIT(seq)
+#endif
+
+#endif // #ifndef FILE_boost_scope_exit_hpp_INCLUDED
+

Added: sandbox/local/boost/local/aux_/scope_exit/typeof/msvc/typeof_impl.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/scope_exit/typeof/msvc/typeof_impl.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,280 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_TYPEOF_MSVC_TYPEOF_IMPL_HPP_INCLUDED
+# define BOOST_TYPEOF_MSVC_TYPEOF_IMPL_HPP_INCLUDED
+
+# include <boost/config.hpp>
+# include <boost/detail/workaround.hpp>
+# include <boost/mpl/int.hpp>
+# include <boost/type_traits/is_function.hpp>
+# include <boost/utility/enable_if.hpp>
+
+# if BOOST_WORKAROUND(BOOST_MSVC,>=1310)
+# include <typeinfo>
+# endif
+
+namespace boost
+{
+ namespace type_of
+ {
+
+ //Compile time constant code
+# if BOOST_WORKAROUND(BOOST_MSVC,>=1300) && defined(_MSC_EXTENSIONS)
+ template<int N> struct the_counter;
+
+ template<typename T,int N = 5/*for similarity*/>
+ struct encode_counter
+ {
+ __if_exists(the_counter<N + 256>)
+ {
+ BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 257>::count));
+ }
+ __if_not_exists(the_counter<N + 256>)
+ {
+ __if_exists(the_counter<N + 64>)
+ {
+ BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 65>::count));
+ }
+ __if_not_exists(the_counter<N + 64>)
+ {
+ __if_exists(the_counter<N + 16>)
+ {
+ BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 17>::count));
+ }
+ __if_not_exists(the_counter<N + 16>)
+ {
+ __if_exists(the_counter<N + 4>)
+ {
+ BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 5>::count));
+ }
+ __if_not_exists(the_counter<N + 4>)
+ {
+ __if_exists(the_counter<N>)
+ {
+ BOOST_STATIC_CONSTANT(unsigned,count=(encode_counter<T,N + 1>::count));
+ }
+ __if_not_exists(the_counter<N>)
+ {
+ BOOST_STATIC_CONSTANT(unsigned,count=N);
+ typedef the_counter<N> type;
+ }
+ }
+ }
+ }
+ }
+ };
+
+# define BOOST_TYPEOF_INDEX(T) (boost::type_of::encode_counter<T>::count)
+# define BOOST_TYPEOF_NEXT_INDEX(next)
+# else
+ template<int N> struct encode_counter : encode_counter<N - 1> {};
+ template<> struct encode_counter<0> {};
+
+ //Need to default to a larger value than 4, as due to MSVC's ETI errors. (sizeof(int)==4)
+ char (*encode_index(...))[5];
+
+# define BOOST_TYPEOF_INDEX(T) (sizeof(*boost::type_of::encode_index((boost::type_of::encode_counter<1005>*)0)))
+# define BOOST_TYPEOF_NEXT_INDEX(next) friend char (*boost::type_of::encode_index(encode_counter<next>*))[next];
+# endif
+
+ //Typeof code
+
+# if BOOST_WORKAROUND(BOOST_MSVC,==1300)
+ template<typename ID>
+ struct msvc_extract_type
+ {
+ template<bool>
+ struct id2type_impl;
+
+ typedef id2type_impl<true> id2type;
+ };
+
+ template<typename T, typename ID>
+ struct msvc_register_type : msvc_extract_type<ID>
+ {
+ template<>
+ struct id2type_impl<true> //VC7.0 specific bugfeature
+ {
+ typedef T type;
+ };
+ };
+#elif BOOST_WORKAROUND(BOOST_MSVC,>=1400)
+ struct msvc_extract_type_default_param {};
+
+ template<typename ID, typename T = msvc_extract_type_default_param>
+ struct msvc_extract_type;
+
+ template<typename ID>
+ struct msvc_extract_type<ID, msvc_extract_type_default_param> {
+ template<bool>
+ struct id2type_impl;
+
+ typedef id2type_impl<true> id2type;
+ };
+
+ template<typename ID, typename T>
+ struct msvc_extract_type : msvc_extract_type<ID,msvc_extract_type_default_param>
+ {
+ template<>
+ struct id2type_impl<true> //VC8.0 specific bugfeature
+ {
+ typedef T type;
+ };
+ template<bool>
+ struct id2type_impl;
+
+ typedef id2type_impl<true> id2type;
+ };
+
+ template<typename T, typename ID>
+ struct msvc_register_type : msvc_extract_type<ID, T>
+ {
+ };
+# else
+ template<typename ID>
+ struct msvc_extract_type
+ {
+ struct id2type;
+ };
+
+ template<typename T, typename ID>
+ struct msvc_register_type : msvc_extract_type<ID>
+ {
+ typedef msvc_extract_type<ID> base_type;
+ struct base_type::id2type // This uses nice VC6.5 and VC7.1 bugfeature
+ {
+ typedef T type;
+ };
+ };
+# endif
+# if BOOST_WORKAROUND(BOOST_MSVC,==1310)
+ template<const std::type_info& ref_type_info>
+ struct msvc_typeid_wrapper {
+ typedef typename msvc_extract_type<msvc_typeid_wrapper>::id2type id2type;
+ typedef typename id2type::type wrapped_type;
+ typedef typename wrapped_type::type type;
+ };
+ //This class is used for registering the type T. encode_type<T> is mapped against typeid(encode_type<T>).
+ //msvc_typeid_wrapper<typeid(encode_type<T>)> will now have a type typedef that equals encode_type<T>.
+ template<typename T>
+ struct encode_type
+ {
+ typedef encode_type<T> input_type;
+ //Invoke registration of encode_type<T>. typeid(encode_type<T>) is now mapped to encode_type<T>. Do not use registered_type for anything.
+ //The reason for registering encode_type<T> rather than T, is that VC handles typeid(function reference) poorly. By adding another
+ //level of indirection, we solve this problem.
+ typedef typename msvc_register_type<input_type,msvc_typeid_wrapper<typeid(input_type)> >::id2type registered_type;
+ typedef T type;
+ };
+
+ template<typename T> typename disable_if<
+ typename is_function<T>::type,
+ typename encode_type<T>::input_type>::type encode_start(T const&);
+
+ template<typename T> typename enable_if<
+ typename is_function<T>::type,
+ typename encode_type<T>::input_type>::type encode_start(T&);
+
+ template<typename Organizer, typename T>
+ msvc_register_type<T,Organizer> typeof_register_type(const T&);
+
+
+# define BOOST_TYPEOF(expr) \
+ boost::type_of::msvc_typeid_wrapper<typeid(boost::type_of::encode_start(expr))>::type
+
+# define BOOST_TYPEOF_TPL(expr) typename BOOST_TYPEOF(expr)
+
+# define BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr) \
+struct name {\
+ enum {_typeof_register_value=sizeof(typeid(boost::type_of::typeof_register_type<name>(expr)))};\
+ typedef typename boost::type_of::msvc_extract_type<name>::id2type id2type;\
+ typedef typename id2type::type type;\
+};
+
+# define BOOST_TYPEOF_NESTED_TYPEDEF(name,expr) \
+struct name {\
+ enum {_typeof_register_value=sizeof(typeid(boost::type_of::typeof_register_type<name>(expr)))};\
+ typedef boost::type_of::msvc_extract_type<name>::id2type id2type;\
+ typedef id2type::type type;\
+};
+
+# else
+ template<int ID>
+ struct msvc_typeid_wrapper {
+ typedef typename msvc_extract_type<mpl::int_<ID> >::id2type id2type;
+ typedef typename id2type::type type;
+ };
+ //Workaround for ETI-bug for VC6 and VC7
+ template<>
+ struct msvc_typeid_wrapper<1> {
+ typedef msvc_typeid_wrapper<1> type;
+ };
+ //Workaround for ETI-bug for VC7.1
+ template<>
+ struct msvc_typeid_wrapper<4> {
+ typedef msvc_typeid_wrapper<4> type;
+ };
+
+ //Tie it all together
+ template<typename T>
+ struct encode_type
+ {
+ //Get the next available compile time constants index
+ BOOST_STATIC_CONSTANT(unsigned,value=BOOST_TYPEOF_INDEX(T));
+ //Instantiate the template
+ typedef typename msvc_register_type<T,mpl::int_<value> >::id2type type;
+ //Set the next compile time constants index
+ BOOST_STATIC_CONSTANT(unsigned,next=value+1);
+ //Increment the compile time constant (only needed when extensions are not active
+ BOOST_TYPEOF_NEXT_INDEX(next);
+ };
+
+ template<class T>
+ struct sizer
+ {
+ typedef char(*type)[encode_type<T>::value];
+ };
+# if BOOST_WORKAROUND(BOOST_MSVC,>=1310)
+ template<typename T> typename disable_if<
+ typename is_function<T>::type,
+ typename sizer<T>::type>::type encode_start(T const&);
+
+ template<typename T> typename enable_if<
+ typename is_function<T>::type,
+ typename sizer<T>::type>::type encode_start(T&);
+# else
+ template<typename T>
+ typename sizer<T>::type encode_start(T const&);
+# endif
+ template<typename Organizer, typename T>
+ msvc_register_type<T,Organizer> typeof_register_type(const T&,Organizer* =0);
+
+# define BOOST_TYPEOF(expr) \
+ boost::type_of::msvc_typeid_wrapper<sizeof(*boost::type_of::encode_start(expr))>::type
+
+# define BOOST_TYPEOF_TPL(expr) typename BOOST_TYPEOF(expr)
+
+# define BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr) \
+ struct name {\
+ BOOST_STATIC_CONSTANT(int,_typeof_register_value=sizeof(boost::type_of::typeof_register_type<name>(expr)));\
+ typedef typename boost::type_of::msvc_extract_type<name>::id2type id2type;\
+ typedef typename id2type::type type;\
+ };
+
+# define BOOST_TYPEOF_NESTED_TYPEDEF(name,expr) \
+ struct name {\
+ BOOST_STATIC_CONSTANT(int,_typeof_register_value=sizeof(boost::type_of::typeof_register_type<name>(expr)));\
+ typedef boost::type_of::msvc_extract_type<name>::id2type id2type;\
+ typedef id2type::type type;\
+ };
+
+#endif
+ }
+}
+
+#endif//BOOST_TYPEOF_MSVC_TYPEOF_IMPL_HPP_INCLUDED

Added: sandbox/local/boost/local/aux_/scope_exit/typeof/typeof.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/scope_exit/typeof/typeof.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,192 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_TYPEOF_TYPEOF_HPP_INCLUDED
+#define BOOST_TYPEOF_TYPEOF_HPP_INCLUDED
+
+#if defined(BOOST_TYPEOF_COMPLIANT)
+# define BOOST_TYPEOF_EMULATION
+#endif
+
+#if defined(BOOST_TYPEOF_EMULATION) && defined(BOOST_TYPEOF_NATIVE)
+# error both typeof emulation and native mode requested
+#endif
+
+#if defined(__COMO__)
+# ifdef __GNUG__
+# ifndef(BOOST_TYPEOF_EMULATION)
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# define BOOST_TYPEOF_KEYWORD typeof
+# endif
+# else
+# ifndef BOOST_TYPEOF_NATIVE
+# ifndef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_EMULATION
+# endif
+# else
+# error native typeof is not supported
+# endif
+# endif
+
+#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)
+# ifdef __GNUC__
+# ifndef BOOST_TYPEOF_EMULATION
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# define BOOST_TYPEOF_KEYWORD __typeof__
+# endif
+# else
+# ifndef BOOST_TYPEOF_NATIVE
+# ifndef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_EMULATION
+# endif
+# else
+# error native typeof is not supported
+# endif
+# endif
+
+#elif defined(__GNUC__)
+# ifndef BOOST_TYPEOF_EMULATION
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# define BOOST_TYPEOF_KEYWORD __typeof__
+# endif
+
+#elif defined(__MWERKS__)
+# if(__MWERKS__ <= 0x3003) // 8.x
+# ifndef BOOST_TYPEOF_EMULATION
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# define BOOST_TYPEOF_KEYWORD __typeof__
+# else
+# error typeof emulation is not supported
+# endif
+# else // 9.x
+# ifndef BOOST_TYPEOF_EMULATION
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# define BOOST_TYPEOF_KEYWORD __typeof__
+# endif
+# endif
+
+#elif defined __DMC__
+# ifndef BOOST_TYPEOF_EMULATION
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# include <boost/typeof/dmc/typeof_impl.hpp>
+# define MSVC_TYPEOF_HACK
+# endif
+#elif defined(_MSC_VER)
+# if (_MSC_VER <= 1300) // 6.5, 7.0
+# ifndef BOOST_TYPEOF_EMULATION
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# include "msvc/typeof_impl.hpp"
+# define MSVC_TYPEOF_HACK
+# else
+# error typeof emulation is not supported
+# endif
+# elif (_MSC_VER >= 1310) // 7.1, 8.0
+# ifndef BOOST_TYPEOF_EMULATION
+# ifndef BOOST_TYPEOF_NATIVE
+# define BOOST_TYPEOF_NATIVE
+# endif
+# include "msvc/typeof_impl.hpp"
+# define MSVC_TYPEOF_HACK
+# endif
+/*# else // 8.0
+# ifndef BOOST_TYPEOF_NATIVE
+# ifndef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_EMULATION
+# endif
+# else
+# error native typeof is not supported
+# endif*/
+# endif
+
+#elif defined(__HP_aCC)
+# ifndef BOOST_TYPEOF_NATIVE
+# ifndef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_EMULATION
+# endif
+# else
+# error native typeof is not supported
+# endif
+
+#elif defined(__DECCXX)
+# ifndef BOOST_TYPEOF_NATIVE
+# ifndef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_EMULATION
+# endif
+# else
+# error native typeof is not supported
+# endif
+
+#elif defined(__BORLANDC__)
+# if (__BORLANDC__ < 0x590)
+# define BOOST_TYPEOF_NO_FUNCTION_TYPES
+# define BOOST_TYPEOF_NO_MEMBER_FUNCTION_TYPES
+# endif
+# ifndef BOOST_TYPEOF_NATIVE
+# ifndef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_EMULATION
+# endif
+# else
+# error native typeof is not supported
+# endif
+
+#else //unknown compiler
+# ifndef BOOST_TYPEOF_NATIVE
+# ifndef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_EMULATION
+# endif
+# else
+# ifndef BOOST_TYPEOF_KEYWORD
+# define BOOST_TYPEOF_KEYWORD typeof
+# endif
+# endif
+
+#endif
+
+#define BOOST_TYPEOF_UNIQUE_ID()\
+ BOOST_TYPEOF_REGISTRATION_GROUP * 0x10000 + __LINE__
+
+#define BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()\
+ <boost/typeof/incr_registration_group.hpp>
+
+#ifdef BOOST_TYPEOF_EMULATION
+# define BOOST_TYPEOF_TEXT "using typeof emulation"
+# include <boost/typeof/message.hpp>
+# include <boost/typeof/typeof_impl.hpp>
+# include <boost/typeof/type_encoding.hpp>
+# include <boost/typeof/template_encoding.hpp>
+# include <boost/typeof/modifiers.hpp>
+# include <boost/typeof/pointers_data_members.hpp>
+# include <boost/typeof/register_functions.hpp>
+# include <boost/typeof/register_fundamental.hpp>
+
+#elif defined(BOOST_TYPEOF_NATIVE)
+# define BOOST_TYPEOF_TEXT "using native typeof"
+# include <boost/typeof/message.hpp>
+# include <boost/typeof/native.hpp>
+#else
+# error typeof configuration error
+#endif
+
+// auto
+#define BOOST_AUTO(Var, Expr) BOOST_TYPEOF(Expr) Var = Expr
+#define BOOST_AUTO_TPL(Var, Expr) BOOST_TYPEOF_TPL(Expr) Var = Expr
+
+#endif//BOOST_TYPEOF_TYPEOF_HPP_INCLUDED

Added: sandbox/local/boost/local/aux_/symbol.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/aux_/symbol.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,75 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_LOCAL_AUX_SYMBOL_HPP_
+#define BOOST_LOCAL_AUX_SYMBOL_HPP_
+
+#include "../config.hpp"
+#include <boost/preprocessor/cat.hpp>
+
+// INFIX is used to separate symbols concatenamed together. Some of these
+// symbols are user defined so they can be anything. Because they can contain
+// underscore `_` and/or start with capital letters, it is NOT safe for the
+// INFIX to be the underscore `_` character as that could lead to library
+// defined symbols containing double underscores `__` which are reserved.
+// C++ standard: (1) "each name that contains a double underscore (_ _) or
+// begins with an underscore followed by an uppercase letter is reserved to
+// the implementation" and (2) "each name that begins with an underscore is
+// reserved to the implementation for use as a name in the global namespace".
+#define BOOST_LOCAL_AUX_SYMBOL_INFIX X // `X` used as separator.
+
+#define BOOST_LOCAL_AUX_SYMBOL_PREFIX \
+
+// Expand to `contract...<name>`.
+#define BOOST_LOCAL_AUX_SYMBOL(name) \
+ BOOST_PP_CAT(BOOST_PP_CAT(boost_local, \
+ BOOST_LOCAL_AUX_SYMBOL_INFIX), name)
+
+// Expand to `contract...aux...<name>` (internal).
+#define BOOST_LOCAL_AUX_INTERNAL_SYMBOL(name) \
+ BOOST_PP_CAT(BOOST_PP_CAT(boost_local_aux, \
+ BOOST_LOCAL_AUX_SYMBOL_INFIX), name)
+
+// Names (functions, variables, etc) //
+
+#define BOOST_LOCAL_AUX_SYMBOL_THIS_PARAM_NAME \
+ BOOST_LOCAL_CONFIG_THIS_PARAM_NAME
+
+#define BOOST_LOCAL_AUX_SYMBOL_ARGS_VARIABLE_NAME \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(args)
+
+#define BOOST_LOCAL_AUX_SYMBOL_PARAMS_LOCAL_VARIABLE_NAME(id) \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(BOOST_PP_CAT(params_, id))
+
+#define BOOST_LOCAL_AUX_SYMBOL_PARAMS_VARIABLE_NAME \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(params)
+
+#define BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_CLASS_NAME( \
+ local_function_name) \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(BOOST_PP_CAT(BOOST_PP_CAT( \
+ functor, BOOST_LOCAL_AUX_SYMBOL_INFIX), \
+ local_function_name))
+
+#define BOOST_LOCAL_AUX_SYMBOL_FUNCTOR_OBJECT_NAME( \
+ local_function_name) \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(BOOST_PP_CAT(BOOST_PP_CAT( \
+ object, BOOST_LOCAL_AUX_SYMBOL_INFIX), \
+ local_function_name))
+
+#define BOOST_LOCAL_AUX_SYMBOL_FUNCTION_REF_NAME( \
+ local_function_name) \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(BOOST_PP_CAT(BOOST_PP_CAT( \
+ local_function_name, BOOST_LOCAL_AUX_SYMBOL_INFIX), ref))
+
+#define BOOST_LOCAL_AUX_SYMBOL_BODY_FUNCTION_NAME \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(body)
+
+#define BOOST_LOCAL_AUX_SYMBOL_BLOCK_FUNCTION_NAME \
+ BOOST_LOCAL_AUX_INTERNAL_SYMBOL(block_function)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/block.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/block.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,93 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+/** @file
+ * @brief Local blocks allow to program code that is executed accessing some of
+ * the variables in scope as constants.
+ */
+
+#ifndef BOOST_LOCAL_BLOCK_HPP_
+#define BOOST_LOCAL_BLOCK_HPP_
+
+#include "function.hpp"
+#include "aux_/block.hpp"
+#include "aux_/symbol.hpp"
+
+/**
+ * @brief This macro starts the declaration of a local block.
+ *
+ * This macro must be used within a declarative context, it must be followed by
+ * the local block body code <c>{ ... }</c> and then by the
+ * @RefMacro{BOOST_LOCAL_BLOCK_END} macro (see the Tutorial section):
+ * @code
+ * { // Some declarative context.
+ * ...
+ *
+ * BOOST_LOCAL_BLOCK(
+ * parenthesized_binding
+ * ) exception_specifications_optional {
+ * ... // Block body.
+ * } BOOST_LOCAL_BLOCK_END
+ *
+ * ...
+ * }
+ * @endcode
+ *
+ * Within templates, the special macro
+ * @RefMacro{BOOST_LOCAL_BLOCK_TPL} must be used instead of
+ * @RefMacro{BOOST_LOCAL_BLOCK}.
+ *
+ * @Note A <c>return;</c> instruction from within a local block body jumps to
+ * the end of the local block body and it does not return the enclosing scope.
+ *
+ * @Params
+ * @Param{parenthesized_binding,
+ * A Boost.Preprocessor sequence that uses the parenthesized syntax to specify
+ * the variables in scope to bind (see the Grammar section).
+ * }
+ * @EndParams
+ *
+ * As usual, exception specifications can be optionally programmed before the
+ * body code block (see the Advanced section).
+ *
+ * @See @RefSect{Tutorial} section, @RefSect{Advanced} section,
+ * @RefSect{Grammar} section, @RefMacro{BOOST_LOCAL_BLOCK_TPL},
+ * @RefMacro{BOOST_LOCAL_BLOCK_END}.
+ */
+#define BOOST_LOCAL_BLOCK(parenthesized_binding) \
+ BOOST_LOCAL_AUX_BLOCK(BOOST_LOCAL_FUNCTION, \
+ parenthesized_binding)
+
+/**
+ * @brief This macro is the same as @RefMacro{BOOST_LOCAL_BLOCK} but
+ * it must be used when declaring local blocks within templates.
+ *
+ * @See @RefMacro{BOOST_LOCAL_BLOCK}, @RefSect{Tutorial} section.
+ */
+#define BOOST_LOCAL_BLOCK_TPL(parenthesized_binding) \
+ BOOST_LOCAL_AUX_BLOCK(BOOST_LOCAL_FUNCTION_TPL, \
+ parenthesized_binding)
+
+/**
+ * @brief This macro ends the definition of a local block.
+ *
+ * This macro must follow the local block body code <c>{ ... }</c> as
+ * shown in the @RefMacro{BOOST_LOCAL_BLOCK} documentation.
+ *
+ * @See @RefMacro{BOOST_LOCAL_BLOCK}, @RefSect{Tutorial} section.
+ */
+#define BOOST_LOCAL_BLOCK_END \
+ /* user block code `{ ... }` here */ \
+ /* ends the local function declaration */ \
+ BOOST_LOCAL_FUNCTION_END_RENAME( \
+ BOOST_LOCAL_AUX_SYMBOL_BLOCK_FUNCTION_NAME) \
+ /* call local funciton and execute block's code imediately */ \
+ BOOST_LOCAL_AUX_SYMBOL_BLOCK_FUNCTION_NAME(); \
+ }
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/config.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/config.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,55 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+/** @file
+ * @brief Configuration macros allow to change the behaviour of this library
+ * at compile-time.
+ */
+
+#ifndef BOOST_LOCAL_CONFIG_HPP_
+#define BOOST_LOCAL_CONFIG_HPP_
+
+/**
+ * @brief Maximum number of function parameters supported for the local
+ * functions.
+ *
+ * @Note If programmers leave this macro #undefined, its default value is
+ * <c>5</c>.
+ *
+ * This only refers to the number of local function parameters and not to the
+ * number of bound variables in scope (the limit on the number of bound
+ * variables is instead the maximum size allowed for a Boost.Preprocessor
+ * sequences).
+ *
+ * @Warning Increasing this number will increase compilation time.
+ *
+ * @See @RefSect{Starting} section.
+ */
+#ifndef BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX
+#define BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX 5
+#endif
+
+/**
+ * @brief The name of the special symbol used to access the bound object
+ * <c>this</c>.
+ *
+ * @Note If programmers leave this macro #undefined, the default symbol used is
+ * <c>this_</c>.
+ *
+ * @Warning Programmers should not #define this macro unless it is absolutely
+ * necessary (e.g., to avoid name clashes with another library which cannot be
+ * changed). Changing the symbol <c>this_</c> effectively changes the public
+ * API of this library.
+ *
+ * @See @RefSect{Starting} section.
+ */
+#ifndef BOOST_LOCAL_CONFIG_THIS_PARAM_NAME
+#define BOOST_LOCAL_CONFIG_THIS_PARAM_NAME this_
+#endif
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/exit.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/exit.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,92 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+/** @file
+ * @brief Local exits allow to program code that is executed when the enclosing
+ * scope is exited.
+ */
+
+#ifndef BOOST_LOCAL_EXIT_HPP_
+#define BOOST_LOCAL_EXIT_HPP_
+
+#include "function.hpp"
+#include "aux_/exit.hpp"
+
+/**
+ * @brief This macro starts the declaration of a local exit.
+ *
+ * This macro must be used within a declarative context, it must be followed by
+ * the local exit body code <c>{ ... }</c> and then by the
+ * @RefMacro{BOOST_LOCAL_EXIT_END} macro (see the @RefSect{Tutorial}
+ * section):
+ * @code
+ * { // Some declarative context.
+ * ...
+ *
+ * BOOST_LOCAL_EXIT(
+ * parenthesized_binding
+ * ) exception_specifications_optional {
+ * ... // Block body.
+ * } BOOST_LOCAL_EXIT_END
+ *
+ * ...
+ * }
+ * @endcode
+ *
+ * Within templates, the special macro
+ * @RefMacro{BOOST_LOCAL_EXIT_TPL} must be used instead of
+ * @RefMacro{BOOST_LOCAL_EXIT}.
+ *
+ * @Note A <c>return;</c> instruction from within a local exit body jumps to
+ * the end of the local exit body and it does not return the enclosing scope.
+ *
+ * @Params
+ * @Param{parenthesized_binding,
+ * A Boost.Preprocessor sequence that uses the parenthesized syntax to specify
+ * the variables in scope to bind (see the @RefSect{Grammar} section).
+ * }
+ * @EndParams
+ *
+ * As usual, exception specifications can be optionally programmed before the
+ * body code block (see the @RefSect{Advanced} section).
+ *
+ * @See @RefSect{Tutorial} section, @RefSect{Advanced} section,
+ * @RefSect{Grammar} section, @RefMacro{BOOST_LOCAL_EXIT_TPL},
+ * @RefMacro{BOOST_LOCAL_EXIT_END}.
+ */
+#define BOOST_LOCAL_EXIT(parenthesized_binding) \
+ BOOST_LOCAL_AUX_EXIT(BOOST_LOCAL_FUNCTION, \
+ parenthesized_binding)
+
+/**
+ * @brief This macro is the same as @RefMacro{BOOST_LOCAL_EXIT} but
+ * it must used when declaring local exits within templates.
+ *
+ * @See @RefMacro{BOOST_LOCAL_EXIT}, @RefSect{Tutorial} section.
+ */
+#define BOOST_LOCAL_EXIT_TPL(parenthesized_binding) \
+ BOOST_LOCAL_AUX_EXIT(BOOST_LOCAL_FUNCTION_TPL, \
+ parenthesized_binding)
+/**
+ * @brief This macro ends the definition of a local exit.
+ *
+ * This macro must follow the local exit body code <c>{ ... }</c> as
+ * shown in the @RefMacro{BOOST_LOCAL_EXIT} documentation.
+ *
+ * @See @RefMacro{BOOST_LOCAL_EXIT}, @RefSect{Tutorial} section.
+ */
+#define BOOST_LOCAL_EXIT_END \
+ /* user code exit `{ ... }` here */ \
+ /* `END_RENAME()` because `EXIT_NAME()` must append `__LINE__` */ \
+ BOOST_LOCAL_FUNCTION_END_RENAME( \
+ BOOST_LOCAL_AUX_EXIT_NAME(function)) \
+ ::boost::local::aux::exit_guard \
+ BOOST_LOCAL_AUX_EXIT_NAME(guard)( \
+ BOOST_LOCAL_AUX_EXIT_NAME(function));
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/function.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/function.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,140 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+/** @file
+ * @brief Local functions allow to program functions locally within the scope
+ * where they are needed.
+ */
+
+#ifndef BOOST_LOCAL_FUNCTION_HPP_
+#define BOOST_LOCAL_FUNCTION_HPP_
+
+#include "aux_/function/decl.hpp"
+#include "aux_/function/end.hpp"
+
+/**
+ * @brief This macro starts the declaration of a local function.
+ *
+ * This macro must be used within a declarative context, it must be followed by
+ * the local function body code <c>{ ... }</c> and then by either the
+ * @RefMacro{BOOST_LOCAL_FUNCTION_END} or the
+ * @RefMacro{BOOST_LOCAL_FUNCTION_END_RENAME} macro (see the
+ * @RefSect{Tutorial} and @RefSect{Advanced} sections):
+ * @code
+ * { // Some declarative context.
+ * ...
+ *
+ * BOOST_LOCAL_FUNCTION(
+ * parenthesized_signature
+ * ) exception_specifications_optional {
+ * ... // Block body.
+ * } BOOST_LOCAL_FUNCTION_END(local_function_name)
+ *
+ * ...
+ * }
+ * @endcode
+ *
+ * As usual, exception specifications can be optionally programmed before the
+ * body code block (see the @RefSect{Advanced} section).
+ *
+ * Within templates, the special macro
+ * @RefMacro{BOOST_LOCAL_FUNCTION_TPL} must be used instead of
+ * @RefMacro{BOOST_LOCAL_FUNCTION}.
+ *
+ * @Params
+ * @Param{parenthesized_signature,
+ * A Boost.Preprocessor sequence that uses the parenthesized syntax to specify
+ * the local function signature and the variables in scope to bind (see the
+ * @RefSect{Grammar} section).
+ * }
+ * @EndParams
+ *
+ * @Note Local functions cannot be copied but it is possible to obtain a
+ * reference to a local function using
+ * @RefClass{boost::local::function_ref}.
+ *
+ * @See @RefSect{Tutorial} section, @RefSect{Advanced} section,
+ * @RefSect{Grammar} section, @RefMacro{BOOST_LOCAL_FUNCTION_TPL},
+ * @RefMacro{BOOST_LOCAL_FUNCTION_END},
+ * @RefMacro{BOOST_LOCAL_FUNCTION_END_RENAME},
+ * @RefClass{boost::local::function_ref}.
+ */
+#define BOOST_LOCAL_FUNCTION(parenthesized_signature) \
+ BOOST_LOCAL_AUX_FUNCTION_DECL(parenthesized_signature, \
+ BOOST_PP_EMPTY() /* no typename keyword */)
+/**
+ * @brief This macro is the same as @RefMacro{BOOST_LOCAL_FUNCTION}
+ * but it must be used when declaring local functions within templates.
+ *
+ * @See @RefMacro{BOOST_LOCAL_FUNCTION}, @RefSect{Tutorial} section.
+ */
+#define BOOST_LOCAL_FUNCTION_TPL(parenthesized_signature) \
+ BOOST_LOCAL_AUX_FUNCTION_DECL(parenthesized_signature, \
+ typename)
+
+/**
+ * @brief This macro ends the definition of a local function.
+ *
+ * This macro must follow the local function body code <c>{ ... }</c> as
+ * shown in the @RefMacro{BOOST_LOCAL_FUNCTION} documentation.
+ *
+ * @Params
+ * @Param{local_function_name,
+ * The name of the local function as it has been specified by the
+ * parenthesized signature passed to @RefMacro{BOOST_LOCAL_FUNCTION}
+ * (otherwise\, the compiler will generate an error).
+ * See the @RefMacro{BOOST_LOCAL_FUNCTION_END_RENAME} macro to relax
+ * this constraint.
+ * }
+ * @EndParams
+ *
+ * @See @RefMacro{BOOST_LOCAL_FUNCTION_END_RENAME},
+ * @RefMacro{BOOST_LOCAL_FUNCTION}, @RefSect{Tutorial} section.
+ */
+#define BOOST_LOCAL_FUNCTION_END(local_function_name) \
+ BOOST_LOCAL_AUX_FUNCTION_END(local_function_name)
+
+/**
+ * @brief This macro ends the definition of a local function while changing
+ * the function name.
+ *
+ * This macro must be used instead of the
+ * @RefMacro{BOOST_LOCAL_FUNCTION_END} macro and it must follow the
+ * local function body code <c>{ ... }</c> as shown in the
+ * @RefMacro{BOOST_LOCAL_FUNCTION} documentation.
+ *
+ * @Params
+ * @Param{new_local_function_name,
+ * This is the new local function name (see the @RefSect{Advanced} section).
+ * }
+ * @EndParams
+ *
+ * The original local function name (as specified by the parenthesized
+ * signature passed to @RefMacro{BOOST_LOCAL_FUNCTION}) must still be
+ * used within the local function body (e.g., for the local function to
+ * recursively call itself).
+ * However, within the enclosing scope the new local function as passed to
+ * @RefMacro{BOOST_LOCAL_FUNCTION_END_RENAME} must be used (e.g., to
+ * invoke the local function).
+ *
+ * @Warning Renamed local functions cannot be directly passed as template
+ * parameters (e.g., to STL algorithms).
+ * However, it is possible to workaround this limitation by getting a
+ * reference to the renamed local function using
+ * @RefClass{boost::local::function_ref} and then by passing the
+ * local function reference as template parameter.
+ *
+ * @See @RefSect{Advanced} section,
+ * @RefMacro{BOOST_LOCAL_FUNCTION_END},
+ * @RefMacro{BOOST_LOCAL_FUNCTION},
+ * @RefClass{boost::local::function_ref}.
+ */
+#define BOOST_LOCAL_FUNCTION_END_RENAME(new_local_function_name) \
+ BOOST_LOCAL_AUX_FUNCTION_END_RENAME(new_local_function_name)
+
+#endif // #include guard
+

Added: sandbox/local/boost/local/function_ref.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/local/function_ref.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,105 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+/** @file
+ * @brief Local function references can be passed as function and template
+ * parameters, they can be assigned to variables, etc.
+ */
+
+#ifndef BOOST_LOCAL_FUNCTION_REF_HPP_
+#define BOOST_LOCAL_FUNCTION_REF_HPP_
+
+namespace boost { namespace local {
+
+/**
+ * @brief Template to hold a reference to a local function while supporting
+ * eventual default function parameters.
+ *
+ * This template defines several specializations to handle a generic number
+ * <c>N</c> of function parameters some of which can have default values.
+ * The number of supported function parameters goes from <c>0</c> (for a
+ * function with no parameter) to a maximum of
+ * @RefMacro{BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX}.
+ *
+ * Each template specialization defines call operators <c>operator()(...)</c>
+ * with a different set of parameters to handle the number of default
+ * parameters specified by <c>defaults</c> (see @RefSect{Advanced} section):
+ * @code
+ * template<typename Result, typename Arg1, ..., typename ArgN, size_t defaults = 0>
+ * class function_ref<Result (Arg1, ..., ArgN), defaults> {
+ * public:
+ * Result operator()(Arg1, ..., ArgN-2, ArgN-1, ArgN);
+ * // Call operators to handle default parameters:
+ * Result operator()(Arg1, ..., ArgN-2, ArgN-1); // iff defaults >= 1
+ * Result operator()(Arg1, ..., ArgN-2); // iff defaults >= 2
+ * ... // etc
+ *
+ * // Copy constructor and assignment operator for local functions:
+ * function_ref(local_function<F, defaults>& ref);
+ * function_ref& operator=(local_function<F, defaults>& ref);
+ * };
+ * @endcode
+ * Where:
+ * - <c>Result</c> is the function result type.
+ * It can be <c>void</c>.
+ * - <c>ArgN</c> is the last function parameter type, <c>ArgN-1</c> is the
+ * second last function parameter type, etc.
+ * These are all optional (none is specified for a function with no
+ * parameter, only <c>Arg1</c> is specified for a function with only one
+ * parameter, etc).
+ * - The operator <c>Result operator()(Arg1, ..., ArgN-2, ArgN-1)</c> is
+ * defined if and only if there are one or more default parameters
+ * (<c>defaults >= 1</c>), the operator
+ * <c>Result operator()(Arg1, ..., ArgN-2)</c> is defined if and only if
+ * there are two or more default parameters (<c>defaults >= 2</c>), etc.
+ * - <c>local_function<F, defaults></c> is an internal type for a local
+ * function with a signature matching <c>F</c> and with a number of default
+ * parameters equal to <c>defaults</c>.
+ * - The copy constructor and assignment operator <c>operator=</c> allow to
+ * assign this template to a reference to a local function with a signature
+ * matching <c>F</c> and with a number of default parameters equal to
+ * <c>defaults</c>.
+ *
+ * @Warning Programmers must make sure that the local function survives the
+ * scope of the function reference (otherwise the reference will be invalid
+ * and its use will generate a run-time error as usual with C++ references).
+ *
+ * @Params
+ * @Param{F,
+ * The function signature expressed using the Boost.Function's
+ * preferred syntax: <c>F = Result (Arg1\, ...\, ArgN)</c>.
+ * }
+ * @Param{defaults,
+ * The number of the function default parameters in
+ * <c>[0\,</c>
+ * @RefMacro{BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX}<c>]</c>.
+ * As usual in C++\, default parameters are counted starting from the last
+ * parameter:
+ * <c>defaults = 0</c> means that no parameter is optional\,
+ * <c>defaults = 1</c> means that the last parameter is optional\,
+ * <c>defaults = 2</c> means that the last two parameters are optional\, etc.
+ * }
+ * @EndParams
+ *
+ * @Note This template is similar to <c>boost::function<></c> but it also
+ * supports eventual default parameters.
+ *
+ * @See @RefSect{Advanced} section,
+ * @RefMacro{BOOST_LOCAL_CONFIG_FUNCTION_ARITY_MAX},
+ * @RefMacro{BOOST_LOCAL_FUNCTION},
+ * <a href='http://www.boost.org/doc/libs/release/doc/html/function.html'>Boost.Function</a>.
+ */
+template<typename F, size_t defaults = 0> // Defaults count is opt.
+struct function_ref {}; // Empty so never used directly.
+
+}} // namespace boost::local
+
+// Template specializations (must be #included here after the above template).
+#include "aux_/function_ref.hpp"
+
+#endif // #include guard
+

Added: sandbox/local/boost/utility/aux_/identity.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/utility/aux_/identity.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,24 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_AUX_IDENTITY_HPP_
+#define BOOST_AUX_IDENTITY_HPP_
+
+namespace boost { namespace aux {
+
+// Identity for type expressions.
+template<typename F> struct identity_type {}; // Empty so cannot be used.
+template<typename T> struct identity_type< void (T) > { typedef T type; };
+
+// Identity for value expressions (call overhead should be optimized away).
+template<typename T> inline T const& identity_value(T const& value)
+ { return value; }
+
+}} // namespace boost::aux
+
+#endif // #include guard
+

Added: sandbox/local/boost/utility/identity.hpp
==============================================================================
--- (empty file)
+++ sandbox/local/boost/utility/identity.hpp 2011-01-10 16:03:24 EST (Mon, 10 Jan 2011)
@@ -0,0 +1,85 @@
+
+// Copyright (C) 2009-2011 Lorenzo Caminiti
+// Use, modification, and distribution is subject to the
+// Boost Software License, Version 1.0
+// (see accompanying file LICENSE_1_0.txt or a copy at
+// http://www.boost.org/LICENSE_1_0.txt).
+
+/** @file
+ * @brief Identity macros are used to pass expressions with commas (not already
+ * wrapped within round parenthesis) as macros parameters.
+ *
+ * @Note The only way (at least as far as the authors know) to pass an
+ * arbitrary number of commas within macro parameters without explicitly
+ * indicating the number of commas is to wrap the parameter within round
+ * parenthesis that are not replaced by macro expansion and then to remove the
+ * extra parenthesis at compile-time (for type expressions) or at run-time
+ * (for value expressions).
+ * This is what these macros do.
+ */
+
+#ifndef BOOST_IDENTITY_HPP_
+#define BOOST_IDENTITY_HPP_
+
+#include "aux_/identity.hpp"
+
+/**
+ * @brief This macro wraps the specified type expression within extra
+ * parenthesis so the type can be passed as a single macro parameter even if
+ * it contains commas.
+ *
+ * This macro expands to an expression that can be passed as a single macro
+ * parameter even if it contains commas and that evaluates to the specified
+ * type at compile-time (see the @RefSect{Advanced} section).
+ *
+ * For example <c>BOOST_IDENTITY_TYPE((std::map<int, double>))</c> can be
+ * passed as a single macro parameter when instead
+ * <c>std::map<int, double></c> cannot (because it contains a comma not wrapped
+ * by round parenthesis so it will be interpreted as two separate macro
+ * parameters by the preprocessor).
+ *
+ * @Params
+ * @Param{parenthesized_type,
+ * The type expression to be passed as macro parameter wrapped by a single set
+ * of round parenthesis <c>(...)</c>.
+ * This type expression can contain an arbitrary number of commas.
+ * }
+ * @EndParams
+ *
+ * @See @RefSect{Advanced} section.
+ */
+#define BOOST_IDENTITY_TYPE(parenthesized_type) \
+ /* must NOT prefix this with `::` to work with parenthesized syntax */ \
+ boost::aux::identity_type< void parenthesized_type >::type
+
+/**
+ * @brief This macro wraps the specified value expression within extra
+ * parenthesis so the value can be passed as a single macro parameter even if
+ * it contains commas.
+ *
+ * This macro expands to an expression that can be passed as a single macro
+ * parameter even if it contains commas and that evaluates to the specified
+ * value at run-time (see the @RefSect{Advanced} section).
+ *
+ * For example <c>BOOST_IDENTITY_VALUE((key_size<int, double>::value))</c>
+ * can be passed as a single macro parameter when instead
+ * <c>key_size<int, double>::value</c> cannot (because it contains a comma not
+ * wrapped by round parenthesis so it will be interpreted as two separate macro
+ * parameters by the preprocessor).
+ *
+ * @Params
+ * @Param{parenthesize_value,
+ * The value expression to be passed as macro parameter wrapped by a single
+ * set of round parenthesis <c>(...)</c>.
+ * This value expression can contain an arbitrary number of commas.
+ * }
+ * @EndParams
+ *
+ * @See @RefSect{Advanced} section.
+ */
+#define BOOST_IDENTITY_VALUE(parenthesized_value) \
+ /* must NOT prefix this with `::` to work with parenthesized syntax */ \
+ boost::aux::identity_value parenthesized_value
+
+#endif // #include guard
+


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk